当清洁工从工作中移除但我们尝试过的回调(after_save
和after_commit
)都没有被触发时,我们会尝试捕获。
我怀疑方法Job#release!
触发数据库查询而不涉及Active Record。
如何在清理工作被删除后触发create_vacant_availabilities
回调?
class Job < ActiveRecord::Base
has_many :assignments
has_many :cleaners, through: :assignments
after_save :create_vacant_availabilities
def create_vacant_availabilities
debugger # doesn't get triggered when calling release!
end
def release!(cleaner = nil)
if cleaner
self.cleaners.delete(cleaner)
else
self.cleaners = []
end
end
end
答案 0 :(得分:1)
创建或销毁Assignment
时,它不会更改与其配对的Job
。
您可以选择两种方式。
首先,您可以使用touch: true
。 From the Rails API ...
<强>:触摸强>
如果为true,则在保存或销毁此记录时将触摸关联对象(设置为当前时间的updated_at / on属性)。如果指定符号,除了updated_at / on属性外,该属性将使用当前时间进行更新。
...这意味着你会想要像
这样的东西class Assignments
belongs_to :job, touch: true
请注意,这不会触发after_save
上的Job
,因此您需要将其设为an after_touch
callback。
另一种可能性是Assignment
上的a before_destroy
callback。
class Assignment
belongs_to :job
before_destroy :create_vacant_abilities_on_job
def create_vacant_abilities_on_job
self.job.create_vacant_abilities
end
根据create_vacant_abilities
背后的逻辑,您可能希望这是around_destroy
或after_destroy
回调。