在迁移中从序列化哈希设置新列值
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 好东西,同时保持与时间无关,因为您在应用程序文件夹中的真实模型永远不会加载。
我有一个模型,其中包含一些信息,最好将其存储为模型上的序列化哈希,因为它对大多数应用程序都不重要,并且因实例而异:
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 好东西,同时保持与时间无关,因为您在应用程序文件夹中的真实模型永远不会加载。