My Rails 3 应用程序有一个用户模型和一个配置文件模型。用户has_one
配置文件。
目前配置文件具有属性 first_name
和 last_name
。虽然我不确定为什么您可能想要更改它们,但我最初认为它们应该是可更改的,因此我将它们放在配置文件模型中而不是用户模型中。
但是,随着应用程序的发展,我发现实际上我需要用户的名字和姓氏不被更改,并且我真的需要他们成为用户模型的一部分而不是配置文件模型。
所以,我想知道,你能写一个迁移吗:
- 将
first_name
列和last_name
列添加到用户模型。 - 从关联的配置文件记录中获取给定用户的现有
first_name
和last_name
值,并将其复制到 User 模型中。 - 从配置文件模型中删除
first_name
列和last_name
列,因为它们不再需要。
那么,这能做到吗?你能举个例子吗?而且,最重要的是,我应该注意什么陷阱吗?我想将此更改应用于生产应用,因此在进行此更改时不会丢失数据至关重要。
谢谢!
当然,非常简单。将其放入迁移中:
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()来减轻缺少配置文件的可能性。 它不会检查保存操作上的错误,因此如果您认为需要,请考虑这一点。 此外,与往常一样,在运行数据库转储备份之前执行数据库转储备份。:)
我认为这是您需要的宝石:
https://github.com/btelles/legacy_migrations
最近我创建了一个 gem,它解决了在迁移中写入迁移数据的问题 - https://github.com/ka8725/migration_data。