Chowlett
Chowlett

Reputation: 46677

Set new column value from serialized hash in migration

I have a model which has some information which is best stored as a serialized Hash on the model, as it is unimportant to most of the app and varies from instance to instance:

class Foo < AR::Base
  attr_accessible :name, :fields
  serialize :fields
end

I have realised that one of the common entries in fields actually is relevant to the app, and would be better placed as an attribute (layout).

Bearing in mind that I should not, ideally, refer to models in migrations, how can I write a migration to add the layout field, and initialise it with the value currently in the fields Hash?

class AddLayoutToCardTemplates < ActiveRecord::Migration
  def change
    add_column :card_templates, :layout, :string, default: 'normal'

    # Initialise `layout` from `fields['layout']`... how? With raw SQL?
  end
end

Upvotes: 0

Views: 587

Answers (1)

BroiSatse
BroiSatse

Reputation: 44715

You should not refer to models in your app folder. This doesn't mean you cannot create local model. :)

class AddLayoutToCardTemplates < ActiveRecord::Migration
  class Foo < AR::Base
    attr_accessible :name, :fields
    serialize :fields
  end

  def change
    add_column :card_templates, :layout, :string, default: 'normal'
    Foo.all.each do |f|
      f.layout = f.fields.delete(:layout)
      f.save
  end
end

That way your migration can use ActiveRecord goodies and yet stays time-independent, as your real model in app folder is never loaded.

Upvotes: 1

Related Questions