0

我有用户模型和用户模型 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

4 回答 4

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
于 2013-01-10T14:05:22.187 回答
0

我不喜欢在迁移中使用模型,因为它会产生不必要的痛苦:

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

所以我推荐在迁移中使用 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
于 2013-01-11T03:07:06.510 回答
0

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

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

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

def change
  User.includes(:profile).all.each{ |u| u.profile.phone = u.phone unless u.phone.nil? }
  remove_column :users, :phone
end
于 2013-01-10T13:56:13.493 回答
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
于 2013-01-10T15:05:56.687 回答