2016-08-04 5 views
0

mehrere Modellinstanzen erstellen habe ich eine Methode wie folgt:Wie auf einmal in Rails

codes.each do |code| 
    company = Company.find_or_create_by(code: code) 
    company.foo = some_value 
    company.bar = some_value2 
    company.save 
end 

Und es schneller machen ich es mit update_all

codes.each do |code| 
    Company.find_or_create_by(code: code) 
    Company.where(code: code).update_all(foo: some_value, bar: some_value2) 
end 

Aber die find_or_create_by Lauf schreiben wollen jedes Mal ein SQL-Befehl. Gibt es eine Möglichkeit, mehrere Modellinstanzen gleichzeitig zu erstellen?

Ich möchte wie Company.create_all_if_not_exist(code: codes) schreiben.

Antwort

0

Ich sehe einen besseren Weg:

existing_companies = Company.where(code: codes) 
existing_codes = existing_companies.pluck(:code) # +1 request 
non_existing_codes = codes - existing_codes 

attrs = {foo: some_value, bar: some_value2} 

existing_companies.update_all(attrs) # +1 request 

# + (codes - existing_codes) requests 
non_existing_codes.each do |code| 
    Company.create({code: code}.merge(attrs)) 
end 
Verwandte Themen