Rails 3:迁移数据

时间:2011-05-20 00:10:13

标签: ruby-on-rails ruby-on-rails-3 migration data-migration

My Rails 3应用程序具有用户模型和个人资料模型。用户has_one个人资料。

目前,个人资料包含first_namelast_name个属性。虽然我不确定您为什么要更改它们,但我最初想象这些应该是可更改的,因此我将它们放在Profile模型中而不是User模型中。

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

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

  1. first_namelast_name列添加到用户模型。
  2. 从关联的个人资料记录中获取给定用户的现有first_namelast_name值,并将其复制到用户模型中。
  3. 从个人资料模型中删除first_namelast_name列,因为它们不再需要了。
  4. 那么,这可以吗?你能展示一个例子吗?而且,最重要的是,我应该注意哪些问题?我想将此更改应用于生产应用,因此在进行此更改时,不要丢失数据至关重要。

    谢谢!

3 个答案:

答案 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)

我认为这是你需要的宝石:

https://github.com/btelles/legacy_migrations

答案 2 :(得分:1)

最近我创建了一个gem来解决迁移中编写迁移数据的问题 - https://github.com/ka8725/migration_data