Ruby on rails 提交后触发回调,但不是触摸的结果

Ruby on rails 提交后触发回调,但不是触摸的结果,ruby-on-rails,Ruby On Rails,我试图在提交对象时触发回调。但是如果提交后的是对象被触摸的结果,我不希望触发回调。我已经研究了更新后的,\u更新后的,\u提交后的,\u保存后的,但这些似乎都与我描述的行为不匹配。除了让我的回调重新加载数据库中的对象,并在继续之前验证除处的updated\u之外的列是否已被修改之外,还有其他方法可以执行此操作吗?我使用的是Rails 5.2。好吧,最后我找到的最简单的方法就是捆绑宝石。该gem在整个事务中保留对记录的更改,并允许我过滤回调,如下所示: # only kick off job if

我试图在提交对象时触发回调。但是如果提交后的
是对象被触摸的结果,我不希望触发回调。我已经研究了更新后的
,\u更新后的
,\u提交后的
,\u保存后的
,但这些似乎都与我描述的行为不匹配。除了让我的回调重新加载数据库中的对象,并在继续之前验证除
处的
updated\u之外的列是否已被修改之外,还有其他方法可以执行此操作吗?我使用的是Rails 5.2。

好吧,最后我找到的最简单的方法就是捆绑宝石。该gem在整个事务中保留对记录的更改,并允许我过滤回调,如下所示:

# only kick off job if the update is not due to a touch
after_commit :kickoff_job, on: :update, unless: -> { transaction_changed_attributes.keys == ['updated_at'] }

这样,如果提交后的
仅仅是触摸的结果,则不会执行回调。

保存后的
似乎是一种方法。它不会在
touch
(is)上执行。但我需要仅在事务完成后才执行此回调,而
在保存后
将被调用,即使sql查询失败当调用
保存
失败时,它返回false…这将停止回调链(
在保存后
将不会被执行)另一个问题是,如果回调失败,我不希望事务回滚。回调涉及到创建sidekiq作业,如果sidekiq或redis或其他方面出现问题,这些作业将在以后重新进行查询,但不应回滚事务。请参阅,其他人可能比我更能雄辩地解释这一特殊问题。这里有一篇不错的文章,强调了在保存后使用
可能导致问题的另一个原因,如果用于后台工作: