在迁移中从序列化哈希设置新列值

时间:2015-02-09 11:24:29

标签: ruby-on-rails rails-migrations

我有一个模型,其中包含一些最好在模型上存储为序列化哈希值的信息,因为它对大多数应用程序都不重要,因实例而异:

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

我已经意识到fields中的一个常见条目实际上与应用相关,并且最好作为属性放置(layout)。

请注意,理想情况下,我不应该在迁移中引用模型,如何编写迁移以添加layout字段,并使用当前fields哈希中的值对其进行初始化?

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

1 个答案:

答案 0 :(得分:1)

您不应该在app文件夹中引用模型。这并不意味着您无法创建本地模型。 :)

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

通过这种方式,您的迁移可以使用ActiveRecord好东西,但保持与时间无关,因为您的app文件夹中的真实模型永远不会被加载。