在before_update中更新模型

时间:2012-04-04 18:20:36

标签: ruby-on-rails ruby activerecord callback

我一直在想,假设我有一个属性的模型,在每个实例中都依赖于其他实例中的相同属性。最好的例子是列表中项目的订单属性。

更新其余项目订单属性的最佳位置是在before_update回调方法中,如果您同时拥有该项目的旧值和新值。

但是现在每当你更新列表中的其他项目时,将再次调用回调,并再次...

我正在寻找一种优雅的解决方法。

我听说过:update_without_callbacks方法,但我不想使用私有方法,而且我觉得添加额外的属性也没必要。

有什么好主意吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

一种方法是使用update_all批量设置所有其他项目的顺序。

通过这种方式,您可以有效地将查询数量限制为1并防止任何回调被触发。

https://github.com/rails/rails/blob/83e42d52e37a33682fcac856330fd5d06e5a529c/activerecord/lib/active_record/relation.rb#L274

答案 1 :(得分:1)

我觉得你必须跨条目进行这种类型的更新,这表明你没有正确地概念化你的问题。为什么不创建具有order属性的List模型,然后在List模型和Item模型之间创建一对多关系。这样,只有一个地方可以更新订购信息,而且不需要复杂和脆弱的回调。