我有用户模型和用户模型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
为此目的适当的迁移是什么?
答案 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