My Rails 3应用程序具有用户模型和个人资料模型。用户has_one
个人资料。
目前,个人资料包含first_name
和last_name
个属性。虽然我不确定您为什么要更改它们,但我最初想象这些应该是可更改的,因此我将它们放在Profile模型中而不是User模型中。
然而,随着应用程序的发展,我发现实际上我需要用户的名字和姓氏不要更改,而且我真的需要它们成为User模型的一部分而不是配置文件模型。
所以,我想知道,你能编写一个迁移:
first_name
和last_name
列添加到用户模型。first_name
和last_name
值,并将其复制到用户模型中。first_name
和last_name
列,因为它们不再需要了。那么,这可以吗?你能展示一个例子吗?而且,最重要的是,我应该注意哪些问题?我想将此更改应用于生产应用,因此在进行此更改时,不要丢失数据至关重要。
谢谢!
答案 0 :(得分:13)
当然,非常容易。把它放在迁移中:
add_column(:users, :last_name, :string)
add_column(:users, :first_name, :string)
User.reset_column_information
User.all.each do |u|
u.last_name = u.profile.try(:last_name)
u.first_name = u.profile.try(:first_name)
u.save
end
remove_column(:profiles, :first_name)
remove_column(:profiles, :last_name)
我在那里使用try()来减少错过配置文件的可能性。它不会检查保存操作的错误,因此如果您认为需要,请将其考虑在内。此外,与往常一样,在运行之前执行数据库转储备份。 :)
答案 1 :(得分:2)
我认为这是你需要的宝石:
答案 2 :(得分:1)
最近我创建了一个gem来解决迁移中编写迁移数据的问题 - https://github.com/ka8725/migration_data。