Rails 3:迁移数据

And*_*rew 4 migration data-migration ruby-on-rails ruby-on-rails-3

我的Rails 3应用程序具有用户模型和配置文件模型.用户has_one个人资料.

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

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

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

  1. first_namelast_name列添加到用户模型.
  2. 从关联的配置文件记录中获取给定用户的现有值first_namelast_name值,并将其复制到用户模型中.
  3. 从Profile模型中删除first_namelast_name列,因为它们不再需要了.

那么,这可以吗?你能展示一个例子吗?而且,最重要的是,我应该注意哪些问题?我想将此更改应用于生产应用程序,因此在进行此更改时,不要丢失数据至关重要.

谢谢!

DGM*_*DGM 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)
Run Code Online (Sandbox Code Playgroud)

我在那里使用try()来减少错过配置文件的可能性.它不会检查保存操作的错误,因此如果您认为需要,请将其考虑在内.此外,与往常一样,在运行之前执行数据库转储备份.:)