如何在rails中取消null后触发回调

时间:2017-10-22 15:54:43

标签: ruby-on-rails activerecord

模型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

1 个答案:

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