Рельсы update_all эквивалентны для assign_attributes - PullRequest
0 голосов
/ 10 октября 2018

У меня есть несколько объектов Class Subject

objects = Subject.where('condition')

Я хочу обновить один атрибут (скажем, colour) для всех этих объектов.Один из способов сделать это - метод update_all:

objects.update_all(colour: 'red')

Но это вызовет N запросов.

Я пытаюсь обновить атрибуты всехэти объекты, а затем вызывают импорт всей совокупности

objects.assign_attributes(colour: 'red')
Subject.import objects

Проблема здесь в том, что assign_attributes можно вызывать для отдельных объектов, но не для всего набора объектов.


Есть ли способ добиться единственного оператора, который обновит атрибуты всех objects без явного их циклического просмотра?

1 Ответ

0 голосов
/ 10 октября 2018

update_all создает один update subjects where condition set colour='red' sql запрос, и это действительно самый быстрый способ обновить несколько записей, недостатком является то, что он не обновляет updated_at и не вызывает никаких обратных вызовов / проверок.

Если вам нужны проверки и обратные вызовы - тогда нет способа обновить их по одному (лучше с find_in_batches или find_each).

...