2

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

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

但是现在,每当您更新列表中的其他项目时,都会再次调用回调,一次又一次......

我正在寻找一种优雅的方式来解决这个问题。

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

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

4

2 回答 2

1

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

这样,您可以有效地将查询数量限制为一个,并防止触发任何回调。

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

于 2012-04-04T18:26:05.493 回答
1

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

于 2012-04-04T18:53:48.560 回答