Rails 3:迁移数据



My Rails 3 应用程序有一个用户模型和一个配置文件模型。用户has_one配置文件。

目前配置文件具有属性 first_namelast_name 。虽然我不确定为什么您可能想要更改它们,但我最初认为它们应该是可更改的,因此我将它们放在配置文件模型中而不是用户模型中。

但是,随着应用程序的发展,我发现实际上我需要用户的名字和姓氏不被更改,并且我真的需要他们成为用户模型的一部分而不是配置文件模型。

所以,我想知道,你能写一个迁移吗:

  1. first_name列和last_name列添加到用户模型。
  2. 从关联的配置文件记录中获取给定用户的现有first_namelast_name值,并将其复制到 User 模型中。
  3. 从配置文件模型中删除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。

相关内容

  • 没有找到相关文章

最新更新