如何在Rails中有效地更新多个实例

时间:2016-03-25 23:08:01

标签: ruby-on-rails ruby

我的Company模型有lending_restricted:boolean列。 有关限制的列表由restricted_codes方法收集。

为了更新必要的公司,我写道:

old_codes = Company.where(lending_restricted: true).pluck(:code)
new_codes = restricted_codes
(new_codes - old_codes).each do |code|
  c = Company.find_by(code: code)
  c.try(:update_attributes, lending_restricted: true)
end
(old_codes - new_codes).each do |code|
  c = Company.find_by(code: code)
  c.try(:update_attributes, lending_restricted: false)
end

它的工作原理基本上很好,但我觉得写两次类似的功能有点多余。 有没有更好的方法来编写这样的方法?

restricted_codes的数量约为100,我的Rails项目中约有4000家公司。

1 个答案:

答案 0 :(得分:2)

未经测试,但也许是这样的?我还更新了您的代码,以便在一个查询中完成(而不是N个查询)。

def update_lending_restriction(codes, restriction)
  Company.where(code: codes).update_all(lending_restricted: restriction)
end

old_codes = Company.where(lending_restricted: true).pluck(:code)
new_codes = restricted_codes

update_lending_restriction(new_codes - old_codes, true)
update_lending_restriction(old_codes - new_codes, false)