Отправка блока кода в динамический метод find_all
-
05-07-2019 - |
Вопрос
Я работаю с некоторыми сложными запросами с использованием динамического метода find_all и дошел до того, что отправка блока этому методу find_all действительно упростит мой код. Р>
Есть ли какой-нибудь плагин или незавершенная работа, связанная с этим?
Проще говоря, я хотел бы сделать что-то вроде:
@products = Product.find_all_by_ids(ids, .....) do |p|
# do something to each product like
p.stock += 10
end
Любое другое руководство или лучший способ сделать это будет с благодарностью.
Решение
Rails 2.3 представил методы find_in_batches
и find_each
(см. здесь ) для пакетной обработки многих записей.
Таким образом, вы можете делать что-то вроде:
Person.find_each(:conditions => "age > 21") do |person|
person.party_all_night!
end
Другие советы
Я использую метод .each
, который Enumerable предоставляет как
@products = Product.find_all_by_ids(ids, .....)
@products.each { |p| p.stock += 10 }
Есть даже некоторые расширения для Enumerable , которые Rails предоставляет, которые могут помочь вам немного, если вы делаете что-то общее. Р>
Кроме того, не забудьте сохранить ваши объекты с чем-то вроде p.save
, если вы хотите, чтобы изменения действительно сохранялись. Р>
Что не так с этим:
@products = Product.find_all_by_ids(ids).each do |p|
p.stock+=10
end
Если вы не знали, каждый возвращает переданный ему массив.