使用 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】:不要多次存储该值 - 除了少数深奥的情况外,所有情况下都是 redundant
和 unnecessary
。
在 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) 模型中的自动同步更新列时
使用“counter_cache”时如何调用 after_save 回调?