Как обновить все, когда нужны обратные вызовы?
Допустим, у меня есть 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
Однако это потенциально означает очень длительную задачу в действии контроллера.
Итак, мой вопрос заключается в том, существует ли какой-либо другой способ улучшения / повышения производительности / повышения производительности для запуска пакетного обновления набора записей, который вызывает обратные вызовы для записей?
3 ответа
Нет, для запуска обратных вызовов вам нужно создать экземпляр объекта, который является дорогостоящей операцией. Я думаю, что единственный способ решить вашу проблему - это преобразовать действия, которые вы выполняете в обратном вызове, в отдельный метод, который может использовать данные, полученные методом select_all, без создания объекта.
Вместо того, чтобы использовать каждый /find_each, попробуйте использовать update
метод вместо:
models.update(column: value)
Вот еще один способ запуска обратных вызовов. Вместо того, чтобы использовать
models.update_all(params)
ты можешь использовать
models.find_each { |m| m.update_attributes(params) }
Я бы не рекомендовал такой подход, если вы имеете дело с очень большими объемами данных.
Надеюсь, поможет!