仅在销毁子记录后执行回调

时间:2017-07-21 08:26:55

标签: ruby-on-rails callback

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

它做我想要的。但这是一个很好的解决方案吗?你能提出一些更好的选择吗?

1 个答案:

答案 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