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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top