Есть ли эквивалент ActiveRecord :: Relation.update_all, который запускает обратные вызовы / наблюдателей? - PullRequest
4 голосов
/ 14 октября 2011

Я хочу выполнить массовое обновление моделей 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 Ответ

3 голосов
/ 08 апреля 2012

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

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

...