【发布时间】:2014-02-17 21:07:42
【问题描述】:
我已经为此苦苦挣扎了一段时间。检查您是否添加、删除或更改了某些子对象的最佳方法是什么。
例如:
class Task < ActiveRecord::Base
after_save :setup_task
# =============== ASSOCIATIONS ===============
has_many :lists, :through => :map_list_tasks
def setup_task
if list_attributes_changed?
do something
end
end
end
我不知道该怎么做。我知道如何检查本地对象的属性是否更改。我怎样才能对孩子们这样做?
谢谢
编辑
在子节点上使用回调的问题在于我正在运行的方法,提取数百万条记录,进行一些数学计算和比较,然后保存数百万条新记录。如果我要在保存列表时触发此操作,它将运行 4 次而不是 1 次(或者将许多列表添加到任务中)。由于运行大约需要 25 分钟,因此这并不理想。这将需要一个多小时,并且会给盒子带来不必要的负载。另一个问题是该方法确实应该从“任务”运行,因为为添加的每个列表选择的选项决定了列表上将发生什么。例如,您可以添加 4 个列表,并将每个列表配置为 25%。在这种情况下,它将平均分配所有 4 个资源。因此,如果我要从列表中运行它,我仍然需要获取任务,然后是该任务的所有子任务,然后比较保存的选项并运行该方法
【问题讨论】:
-
子对象是什么意思?请解释一下。
-
任务有很多列表。我的任务表单有列表的嵌套表单。当我在任务表单上添加、删除或编辑这些列表时,我想运行 setup_task。如果任务本身的属性发生了变化(但不是列表属性),那么我不想运行 setup_task
-
在这种情况下,您应该在
List模型类中有def setup_task回调。保存列表对象后更新相关任务,否则不更新。
标签: ruby-on-rails ruby callback