Enviando um bloco de código para um método dinâmico find_all
-
05-07-2019 - |
Pergunta
Estou trabalhando com algumas consultas complexas usando o método dinâmico find_all e cheguei a um ponto em que o envio de um bloco para esse método find_all realmente simplificaria meu código.
Existe algum plugin ou trabalho em andamento lidando com isso?
Em termos simples, gostaria de fazer algo como:
@products = Product.find_all_by_ids(ids, .....) do |p|
# do something to each product like
p.stock += 10
end
Qualquer outro guia ou melhor maneira de fazer isso seria muito apreciada.
Solução
Rails 2.3 introduziu o find_in_batches
e find_each
Métodos (ver aqui) para o processamento em lote de muitos registros.
Você pode assim fazer coisas como:
Person.find_each(:conditions => "age > 21") do |person|
person.party_all_night!
end
Outras dicas
Eu uso o .each
método que enumerável fornece como
@products = Product.find_all_by_ids(ids, .....)
@products.each { |p| p.stock += 10 }
Existem até alguns extensões para enumeráveis Esse Rails fornece que pode ajudá -lo um pouco se você estiver fazendo algumas coisas comuns.
Além disso, não se esqueça de salvar seus objetos com algo como p.save
Se você deseja que as alterações realmente persistam.
O que há de errado com isso:
@products = Product.find_all_by_ids(ids).each do |p|
p.stock+=10
end
Caso você não soubesse, cada um retorna a matriz passou para ela.