2011-05-20 156 views
4

我的Rails 3应用程序有一个User模型和一个Profile模型。 A用户has_one配置文件。Rails 3:迁移数据

当前配置文件具有属性first_namelast_name。虽然我不知道为什么你可能想要改变它们,但我原本以为这些应该是可以改变的,所以我把它们放在Profile模型而不是User模型中。

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

所以,我想知道,你可以写一个迁移会:

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

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

谢谢!

+0

我有点好奇为什么'User'模型不允许改变这些属性,而'Profile'模型会改变。在这些情况下真的不应该有所不同,除非您明确指定哪些属性可以访问。 – raidfive 2011-05-20 01:39:19

+0

哦,他们都可以允许或不允许更改 - 我只是在用户模型中将事物分组为“永久”(即,我不让用户更改它们),并且配置文件中的所有内容都是“非永久性的“(即我允许用户改变它们)。但是我发现我越来越需要使用用户的名字和姓氏作为文件标识符的一部分,这些文件标识符确实无法更改,所以对于我而言,我宁愿将其与更静态的用户属性进行分组。 – Andrew 2011-05-20 01:41:26

回答

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()来缓解一个缺少配置文件的可能性。它不检查保存操作中的错误,因此如果您认为需要,请考虑这一点。此外,一如既往,在运行数据库转储备份之前进行备份。 :)

+0

这太棒了!谢谢! – Andrew 2011-05-20 17:58:13