#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, такие как проверки и обратные вызовы.
Я надеюсь, что это удовлетворительный ответ для вас.