【问题标题】:Sidekiq won't execute jobSidekiq 不会执行作业
【发布时间】:2016-04-26 16:36:30
【问题描述】:

这是我第一次使用 sidekiq 在 Rails 4 中执行预定操作。我创建了一个 perform 方法来查找为空的 hashtaggable_ids 并将它们从数据库中删除。当我尝试使用 Rails Console 的 api 运行作业时,出现以下错误。

remove_hashtag_orphans.rb

from -e:1:in `load'
    from -e:1:in `<main>'>> RemoveHashtagOrphans.new.perform(hashtaggable_id)
NameError: undefined local variable or method `hashtaggable_id' for main:Object

jobs文件的内容如下。

 class RemoveHashtagOrphans < ActiveJob::Base
      queue_as :default

      def perform(hashtaggable_id)
        #Needs argument 
        orphans = SimpleHashtag::Hashtag.all.select {|h| h.hashtaggables.size == 0}
        orphans.map(&:destroy)
      end
    end

    RemoveHashtagOrphans.new.perform(hashtaggable_id)

没有sidekick的原始方法是这样的。

def self.clean_orphans
  # Needs refactoring to call a single SQL query
  orphans = self.all.select { |h| h.hashtaggables.size == 0 }
  orphans.map(&:destroy)
end

【问题讨论】:

  • 使用您尝试在 rails 控制台中运行的代码 - 错误实际上并非来自您的方法内部。您需要在将 hashtaggable_id 作为参数传递之前定义它。
  • 将底部的方法转换为工作的最佳方法是什么?我必须找到 hashtaggable_id 的第一个,看看哪一个有零个唯一的 hashtags 连接到它们(hashtaggables),然后全部销毁。
  • 好吧,我实际上对 Sidekiq 并没有超级经验(我自己也使用过 Resque,但并不是说它更好),但我认为您可以从后台访问您的数据库连接和 Rails 应用程序工作。因此,除了将其包装在 sidekiq 方法中之外,没有理由对其进行重构。
  • 据我所知,您需要一个参数才能使 perform 方法起作用。我只是无法将此方法放入执行块的上下文中。

标签: ruby-on-rails ruby ruby-on-rails-4 sidekiq rails-activejob


【解决方案1】:

RemoveHashtagOrphans.new.perform(hashtaggable_id) 将实例化并执行正在进行的作业。使用RemoveHashtagOrphans.perform_later(hashtaggable_id) 将作业发送到 Sidekiq。

您的代码失败,因为您有一个未定义的变量:

hashtaggable_id = 10
RemoveHashtagOrphans.new.perform(hashtaggable_id)

【讨论】:

  • 是的,我正在尝试测试它是否适用于 new.perform。之后,我打算使用 perform_later 方法进行生产 [RemoveHashtagOrphans.perform_at(1.month.from_now)]。它只是不起作用,因为 hashtaggable_id 被视为未定义的方法。
  • 因为那个变量不存在。查看更新。
  • 如何将 simple_hashtag_hashtaggings 表中的所有记录传递给 perform 方法。我不一定要搜索特定的 id,但要找到所有。 perform 方法是否需要参数。我可以使用 def perform hashtags = SimpleHashtag::Hashtag.all 吗? .... end 如果我可以在表中找到所有 hashtaggable_ids,然后执行操作。那会奏效的。
  • 我尝试使用您创建的方法,但它不起作用,因为 hashtags.all.select 已经是该方法的一部分。
  • 如果您只想在后台使用 Sidekiq 运行 clean_orphans,请调用 Foo.delay.clean_orphans 而不是 Foo.clean_orphans
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2016-07-13
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多