Подтвердить что ты не робот

Как обновить все, когда вам нужны обратные вызовы?

Скажем, у меня есть 15 идентификаторов пользователей в массиве с именем user_ids.

Если я хочу, скажем, изменить все свои имена на "Боб", я мог бы сделать:

users = User.find(user_ids)
users.update_all( :name => 'Bob' )

Однако это не вызывает обратные вызовы. Если мне нужно активировать обратные вызовы при сохранении этих записей, насколько мне известно, единственный способ использовать:

users = User.find(user_ids)
users.each do |u|
  u.name = 'Bob'
  u.save
end

Это потенциально означает очень длительную задачу в действии контроллера.

Итак, мой вопрос: есть ли другой способ повышения/повышения производительности /railsier для запуска пакетного обновления для набора записей, которые запускают обратные вызовы в отчетах?

4b9b3361

Ответ 1

Нет, чтобы выполнить обратные вызовы, вы должны создать экземпляр объекта, который является дорогостоящей операцией. Я думаю, что единственный способ решить вашу проблему - реорганизовать действия, которые вы делаете в обратном вызове, в отдельный метод, который может использовать данные, полученные методом select_all без создания объекта.

Ответ 2

Вот еще один способ запуска обратных вызовов. Вместо использования

models.update_all(params)

вы можете использовать

models.find_each { |m| m.update_attributes(params) }

Я бы не рекомендовал этот подход, если вы имеете дело с очень большими объемами данных. Надеюсь, это поможет!

Ответ 3

Вместо использования каждого /find _each попробуйте

models.update(column:value)