在我的Rails应用程序中,我有一个User
类:
class User < ActiveRecord::Base
has_one :profile
has_one :sorting
has_many :people
has_many :companies
has_many :projects
has_many :invoices
has_many :payments
...
def move_to(user)
associations = %w(companies people projects invoices payments)
associations.each do |a|
send(a).update_all(:user_id => user.id)
end
%w(profile sorting).each do |a|
send(a).update_column(:user_id, user.id) # would like to use update_all here but not working
end
end
end
有没有办法清理我的move_to
方法,以便我也可以在update_all
关系上运行has_one
?
答案 0 :(得分:2)
您可以使用关系而不是关联:
def move_to(user)
relations = [Profile, Sorting, Invoice, ...]
relations.each do |relation|
relation.where(user_id: self.id).update_all(:user_id => user.id)
end
end
但如果您的协会有其他条件,这将是危险的。
答案 1 :(得分:0)
您可以在声明关联时传递阻止。
class User < ActiveRecord::Base
has_one :profile do
def update_all(attributes={})
update_column(attributes) unless attributes.empty?
end
end
end
您可以通过关注来减少这种情况,这样您只需要编写一次。但是,这似乎是非常很长的路要走,只需将两个循环减少为一个。
答案 2 :(得分:0)
您可以使用association_scope获取has_one关系上的ActiveRecord::Relation
对象:
%i[profile sorting].each do |a|
association(a).association_scope.update_all(:user_id => user.id)
end