使用 after_save 更新所有 belongs_to 记录

Posted

技术标签:

【中文标题】使用 after_save 更新所有 belongs_to 记录【英文标题】:Using after_save to update all belongs_to records 【发布时间】:2011-08-02 20:35:17 【问题描述】:

我正在用 Ruby on Rails (3.0) 构建一个项目管理应用程序。我试图弄清楚如何在更新项目列时更新项目的所有任务。这是情况。

正如预期的那样,我在 /projects/index.html.erb 中列出了所有项目。我正在使用可排序列表 (from Ryan Bates tutorial) 在用户对列表进行排序时更新 project.position 字段。

当项目列表排序时,project.position 列在每次排序时都会更新,我还想更新belong_to 该项目的所有任务的 task.project_position 列。所以 task.project_position = project.position.

我猜这是通过项目模型中的 after_save 完成的,但我可能完全错了。

【问题讨论】:

【参考方案1】:

不要多次存储该值 - 除了少数深奥的情况外,所有情况下都是 redundantunnecessary

在 Ruby/Rails 中,您可以 delegate 从任务到项目的位置方法,如下所示(在您的任务模型中):

delegate :position, :to => :project, :prefix => true, :allow_nil => true

设置完成后,您现在拥有task.project_position,它将通过两者之间的关联返回 project.position 的值,而不会在项目中的所有任务中重复该数据元素。

所有这一切都假设任务belongs_to :project(可能还有项目has_many :tasks)。

more detailed explanation.

如果您觉得出于某种原因确实必须走非规范化路线,那么是的,after_save 就是这样做的地方。

【讨论】:

以上是关于使用 after_save 更新所有 belongs_to 记录的主要内容,如果未能解决你的问题,请参考以下文章

当我在 ember 数据中创建或更新 (belongs_to) 模型和 (has_many) 模型中的自动同步更新列时

在 rails 3 中弃用 after_save 解决方案

Rails after_save 错误

使用“counter_cache”时如何调用 after_save 回调?

shoulda-callback-matchers after_save 条件问题

Rails 3:取消在 after_save 上的插入