delayed_job:使用handle_asynchronously时出现'undefined method'错误

时间:2014-04-17 18:39:46

标签: ruby-on-rails ruby csv delayed-job

我正在尝试使用delayed_job在我的rails数据库中运行更大的csv导入。这是我的控制器和模型方法:

控制器方法

def import
    InventoryItem.import(params[:file], params[:store_id])
    redirect_to vendors_dashboard_path, notice: "Inventory Imported."
end

模型方法

def self.import(file, store_id)
CSV.foreach(file.path, headers: true) do |row|
inventory_item = InventoryItem.find_or_initialize_by_upc_and_store_id(row[0], store_id)
inventory_item.update_attributes(:price => row.to_hash["price"], :updated_at => "#{Time.now}")
    end
end

handle_asynchronously :import

我已将'delayed_job'和'daemons'添加到我的gemfile中,然后捆绑。运行生成器,使用rake jobs:work启动开发工作进程,然后尝试通过应用程序运行导入。这是我得到的错误:

Routing Error
undefined method `import' for class `InventoryItem'

整合delayed_job时我有没有想念?这个导入过程之前运行得很好,所以只是想知道我搞砸了哪里。提前谢谢!

1 个答案:

答案 0 :(得分:12)

您的导入是一个类方法,您应该在模型类名称的单例类上调用handle_asynchronously:

您可以使用元类技巧来对类方法进行别名:

class << self
   def import(file, store_id)
     CSV.foreach(file.path, headers: true) do |row|
      inventory_item = InventoryItem.find_or_initialize_by_upc_and_store_id(row[0], store_id)
      inventory_item.update_attributes(:price => row.to_hash["price"], :updated_at => "#{Time.now}")
     end
   end
  handle_asynchronously :import
end

希望这有帮助!