【发布时间】: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