Rails update_all等效于Assign_attributes

时间:2018-10-10 10:28:46

标签: ruby-on-rails rails-activerecord

我有一个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 :(得分:2)

update_all构造了一个update subjects where condition set colour='red' sql查询,这确实是更新多个记录的最快方法,其缺点是它不会更新updated_at并且不会调用任何回调/验证。

如果您需要验证和回调-那么就无法一一更新(最好使用find_in_batchesfind_each)。