after_save
在保存记录时调用(但在提交之前)。同时 after_create
在提交数据库事务之后调用。
除了这篇文章http://www.justinweiss.com/articles/a-couple-callback-gotchas-and-a-rails-5-fix/这解释了 Sidekiq 作业找不到对象,因为代码在对象提交之前运行,我需要知道哪些其他陷阱才能决定是否 after_create
或 after_commit
哪个更适合使用?
最佳答案
如果您想避免 Sidekiq 像您描述的那样“太快”,我最常看到的解决方案是使用 after_commit
。
这有一个很大的缺点 - 如果您正在更新模型中的某些内容,after_commit
Hook 将再次运行。确保这永远不会发生。
看例子:
您正在创建一个 TextMessage
并使用 status='unsent'
将其保存到数据库中,并在 after_commit
Hook 中添加一个 SidekiqJob,用于通过 API 将其发送到您的 SMS 网关。
此 API 返回一个 ID,用于远程跟踪它,然后您将其更新为之前的 TextMessage。这将触发重新发送 TextMessage。
当然,after_commit
也会响应on: :update
和on: create
,比如before_save
等
在这里,您可以在作业中确保作业之前未发送
,但这仍然可能触发重新发送,即使您已经确保了这一点。
这里面很容易死循环,一不小心可能会损失不少。
关于ruby-on-rails - Rails after_save 和 after_commit 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43469086/