class MyTask < ApplicationRecord
has_many :jobs, as: :ownerable, dependent: :destroy
accepts_nested_attributes_for :jobs, allow_destroy: true
before_save :set_some_data
end
class Job < ApplicationRecord
belongs_to :ownerable, polymorphic: true, optional: true
end
在:set_some_data方法中,我们实际上从属于MyTask对象的所有作业中获取值并执行一些计算并将结果保存在一列中(实际上只是一个self.column_name = calculated_value
,而不是实际调用save)
问题是列上的UPDATE发生在标记为销毁的任何作业之前,即"_destroy" => 1
中的params
。显然,它包含来自已删除作业的数据,这是不正确的。
我目前正在执行以下操作 - 将回调更改为:
after_save :set_some_data
def set_some_data
#Do stuff
# WARNING: Don't use any method that will trigger an after_save callback. Infinite loop otherwise.
self.update_columns(column_name: calculated_value)
end
它做我想要的。但这是一个很好的解决方案吗?你能提出一些更好的选择吗?
答案 0 :(得分:1)
你可以使用after_destroy执行此操作并将该方法放在job.rb中这将确保当子项被删除(作业)时它将调用父项来更新值
class Job < ApplicationRecord
belongs_to :ownerable, polymorphic: true, optional: true
after_destroy :update_parent
def update_parent
# check your parent model
self.ownerable.update_columns(column_name: calculated_value)
end
end
有关详细回调,您可以查看this和