rails迁移复制和删除表

时间:2013-01-10 13:36:16

标签: ruby-on-rails migration

我有用户模型和用户模型has_one个人资料模型。 我也有user.phone和user.profile.phone,但我想删除user.phone,我只会使用user.profile.phone。

在删除user.phone之前,如果user.phone不为空,我想将user.phone复制到user.profile.phone。然后我将删除user.phone

例如:

user.phone = 123
user.profile.phone = 234

迁移后:

user.phone will be removed
user.profile.phone = 123 - 234

为此目的适当的迁移是什么?

4 个答案:

答案 0 :(得分:1)

试试这个

class YourMigration < ActiveRecord::Migration
 def self.up
   User.find_each do |user|
 user.profile.update_attributes(:phone => user.phone) unless user.phone.blank?
   end
   remove_column :users, :phone
 end

 def self.down
  add_column :users, :phone, :string
 end
end

答案 1 :(得分:0)

如果您的数据库不是很大,您可以这样做:

User.includes(:profile).all.each{ |u| u.profile.phone = u.phone unless u.phone.nil? }

在你的控制台中。或者你可以在你的迁移中写这样的smth:

def change
  User.includes(:profile).all.each{ |u| u.profile.phone = u.phone unless u.phone.nil? }
  remove_column :users, :phone
end

答案 2 :(得分:0)

class YourMigration < ActiveRecord::Migration
  def self.up
     User.where("phone IS NOT NULL").includes(:profiles).each{ |u| u.profile.phone = u.phone}
     remove_column :users, :phone
  end
  def self.down
    add_column :users, :phone, :string
  end
end

答案 3 :(得分:0)

我不想在迁移中使用Model,因为它会造成不必要的痛苦:

假设许多人在同一个项目上工作而你在迁移中使用模型做了提交。其他人删除用户模型或对模型应用一些验证并进行提交。当他或其他人尝试运行迁移时,它可能会失败,因为您使用的模型不存在或有一些验证。

所以我建议在迁移中使用SQL语句。

class SomeMigartion < ActiveRecord::Migration
  def self.up
    execute('update profiles p inner join users u on p.user_id = u.id set p.phone = u.phone where u.phone is not null')
    remove_column :users, :phone
  end

  def self.down
     add_coulmn :users, :phone
  end
end