如何在Rails 4中使用has_one关系的update_all?

时间:2013-12-05 14:29:50

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

在我的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

3 个答案:

答案 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