2012-04-04 41 views
2

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

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

但现在只要你更新列表中的其他项目的回调将被再次调用,并再次...

我在寻找解决这个优雅的方式。

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

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

+0

数据库触发器可以接受吗?这不是一个活动记录解决方案,但它可能是最高性能和可靠的。 – Brandan 2012-04-04 18:23:30

回答

1

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

这样你就可以有效地限制查询的数量到一个,并防止任何回调被触发。

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

+0

当一组项目(例如在所有其他项目中递增一个整数)的变化相同时,此方法可以很好地工作,但如果变化发生变化,则需要更多的努力。感谢你的回答! – hananamar 2012-04-06 11:02:46

1

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