Rails: как обновить все через ActiveRecord_Relation - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть две похожие модели через has_one, как это:

class Asset
  has_one :device

class Device
  belongs_to :asset

У меня есть ActiveRecord_Relation активов, как это:

assets = Asset.all

Мне нужно обновить поле в каждом устройстве для каждого актива. Я не хочу создавать массив каждого связанного устройства, так как это будет очень неэффективно. Я пробовал такие вещи, как:

assets.joins(:device).update_all( {:device=>{:my_field=>6} )

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Решение таково:

assets = Asset.some_scope.some_other_scope
devices = Device.where("devices.asset_id IN (?)", assets.select(:id))
devices.update_all("devices.my_field=?", 6)

При этом используется один запрос к базе данных для обновления всех связанных устройств через их связь с активами.

0 голосов
/ 08 ноября 2018

Вы можете использовать SQL:

assets.joins(:device).update_all(["devices.my_field=?", 6])

или, если это поле зависит от других:

assets.joins(:device).update_all("devices.my_field=assets.other_field")
...