代码之家  ›  专栏  ›  技术社区  ›  heroxav

Sidekiq在worker中找不到对象

  •  3
  • heroxav  · 技术社区  · 7 年前

    User 在我的应用程序中,我运行一个 after_create 方法,然后异步触发Sidekiq工作线程。

    def perform user_id
        @user = ::User.find user_id
        # ...
    end
    

    ActiveRecord::RecordNotFound:找不到id=315928979197048617的用户

    但使用rails控制台检查用户id是否可找到:

    User.find(315928979197048617)
    => #<User id: 315928979197048617>
    

    这是因为创建新用户需要一些时间,并且工作人员在完成时已经执行了该方法吗?如果,我该如何纠正这种行为?

    1 回复  |  直到 7 年前
        1
  •  8
  •   philnash    7 年前

    你说得绝对正确 after_create ActiveRecord::RecordNotFound worker中的错误(尽管如果数据库赢得比赛,那么一切似乎都按计划进行)。

    after_commit 回调。由于您仅在创建时执行此操作,因此需要 after_commit on: :create

    这确实会引起最后一个问题, This blog post has a good write up on using after_commit 并建议 test_after_commit gem