2016-03-25 2 views
0

У меня есть модель Company, у которой есть lending_restricted:boolean column. Список об ограничении производится методом restricted_codes.Как эффективно обновлять несколько экземпляров в Rails

И обновить только необходимые компании, я написал так:

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 компаний.

ответ

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) 
Смежные вопросы