Invio di un blocco di codice a un metodo dinamico find_all
-
05-07-2019 - |
Domanda
Sto lavorando con alcune query complesse usando il metodo dinamico find_all e sono arrivato a un punto in cui l'invio di un blocco a quel metodo find_all mi semplificherebbe davvero il codice.
Esistono plugin o lavori in corso su questo?
In termini semplici, vorrei fare qualcosa del tipo:
@products = Product.find_all_by_ids(ids, .....) do |p|
# do something to each product like
p.stock += 10
end
Qualsiasi altra guida o modo migliore per farlo sarebbe molto apprezzata.
Soluzione
Rails 2.3 ha introdotto i metodi find_in_batches
e find_each
(vedi qui ) per l'elaborazione batch di molti record.
Puoi quindi fare cose come:
Person.find_each(:conditions => "age > 21") do |person|
person.party_all_night!
end
Altri suggerimenti
Uso il metodo .each
che Enumerable fornisce come
@products = Product.find_all_by_ids(ids, .....)
@products.each { |p| p.stock += 10 }
Esistono anche alcune estensioni a Enumerable fornite da Rails che potrebbero aiutarti a un po 'se stai facendo delle cose comuni.
Inoltre, non dimenticare di salvare i tuoi oggetti con qualcosa come p.save
se vuoi che le modifiche persistano davvero.
Cosa c'è di sbagliato in questo:
@products = Product.find_all_by_ids(ids).each do |p|
p.stock+=10
end
Nel caso non lo sapessi, ognuno restituisce l'array ad esso passato.