模型1:
class Programmer
has_many :tasks, dependent: :nullify
end
模型2:
class Task
belongs_to :programmer
end
程序员有很多任务。当我摧毁程序员时,他的任务应该无效(programmer_id = nil),但他的任务也应该设置为打开(status ='open'),与其当前状态无关。
我想破坏程序员,除了使programmer_id无效之外,在任务中将 status 属性设置为'open',但是nullify不会触发回调
我不知道怎么做,因为:nullify不会触发回调,只有:destroy
答案 0 :(得分:1)
正如您所说,dependent: :nullify
不会触发回调。我可能会在堆栈的某个位置(在Service
或类似的位置)中定义一个方法,该方法知道如何删除程序员,然后在所有先前关联的任务上设置状态。
如果您确实想自动执行此操作,另一个选择是使用ActiveSupport工具API挂钩所有SQL执行并在那里进行比较:
ActiveSupport::Notifications.subscribe "sql.active_record" do |*args|
data = args.extract_options!
if data[:sql] == "UPDATE \"tasks\" SET \"programmer_id\" = NULL WHERE \"tasks\".\"programmer_id\" = $1"
Task.where(programmer_id: nil, status: 'assigned').update_all(status: 'open')
end
end