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

Set new column value from serialized hash in migration

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

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

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

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

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

您不应在您的应用程序文件夹中引用模型。这并不意味着您不能创建本地模型。 :)

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 好东西,同时保持与时间无关,因为您在应用程序文件夹中的真实模型永远不会加载。