Существует ли эквивалент ActiveRecord ::Relation.update_all, который запускает обратные вызовы / наблюдателей?

#ruby-on-rails-3 #activerecord #observer-pattern

#ruby-on-rails-3 #activerecord #наблюдатель-шаблон

Вопрос:

Я хочу выполнить массовое обновление моделей ActiveRecord в соответствии с:

 MyModel.where(:field1=>"value1").update_all(:field1=>"value2")
  

У меня есть наблюдатель в MyModel, который мне нужно запустить при этом обновлении, и я не вижу, чтобы это происходило. Это поведение согласуется с документами.

http://apidock.com/rails/ActiveRecord/Relation/update_all

Существует ли «встроенный» или «рекомендуемый» способ выполнения массового обновления и запуска наблюдателей, кроме итерации (например):

 MyModel.where(:field1=>"value1").each{ |m| m.update_attributes(:field1=>"value2") }
  

Ответ №1:

Нет, такого способа нет. Причина, вероятно, в том, что каждое решение все равно должно было бы повторяться в какой-то момент, потому что все обратные вызовы для каждого объекта должны быть вызваны. Причина, по которой существует ‘update_all’, заключается в том, чтобы предоставить разработчикам возможность массового обновления записей (более или менее) непосредственно с помощью вызовов mysql API… в некотором смысле, чтобы точно обойти любые функции activerecord, такие как проверки и обратные вызовы.

Я надеюсь, что это удовлетворительный ответ для вас.