【问题标题】:updating a model while in before_update在 before_update 中更新模型
【发布时间】:2012-04-04 18:20:35
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 数据库触发器可以接受吗?它不是一个 Active Record 解决方案,但它可能是最高效和最可靠的。

标签: ruby-on-rails ruby activerecord callback


【解决方案1】:

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

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

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

【讨论】:

  • 当一组项目的更改相同时(例如在所有其他项目中增加一个整数),此方法将很有效,但如果更改发生变化,则需要更多的努力。感谢您的回答!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多