【问题标题】:Rails + Sidekiq not recognizing classRails + Sidekiq 无法识别类
【发布时间】:2017-02-15 18:46:01
【问题描述】:

我的app/services 中有一个CsvImport 服务对象,我正在尝试从Worker 中调用其中一个类方法。

class InventoryUploadWorker
  include Sidekiq::Worker

  def perform(file_path, company_id)
    CsvImport.csv_import(file_path, Company.find(company_id))
  end
end

但似乎工人不知道类是什么,我尝试require 'csv_import' 无济于事。

这里是崩溃的地方:

WARN: ArgumentError: undefined class/module CsvImport

被调用的方法 csv_import.rb

class CsvImport
require "benchmark"
require 'csv'


def self.csv_import(filename, company)
    time = Benchmark.measure do
        File.open(filename) do |file|
            headers = file.first
            file.lazy.each_slice(150) do |lines|
                Part.transaction do 
                    inventory = []
                    insert_to_parts_db = []
                    rows = CSV.parse(lines.join, write_headers: true, headers: headers)
                    rows.map do |row|
                        part_match = Part.find_by(part_num: row['part_num'])
                        new_part = build_new_part(row['part_num'], row['description']) unless part_match
                        quantity = row['quantity'].to_i
                        row.delete('quantity')
                        row["condition"] = match_condition(row)
                        quantity.times do 
                            part = InventoryPart.new(
                                part_num: row["part_num"], 
                                description: row["description"], 
                                condition: row["condition"],
                                serial_num: row["serial_num"],
                                company_id: company.id,
                                part_id: part_match ? part_match.id : new_part.id
                                )           
                            inventory << part                   
                        end
                    end
                    InventoryPart.import inventory
                end
            end
        end         
    end
    puts time
end

【问题讨论】:

  • 你能发布那个文件吗,CsvImport
  • 为了简洁起见,我发布了调用的类/方法。 @冰人
  • 你使用的是什么版本的 Rails?
  • 4.2.5.1 @Iceman
  • 嗨,我也有同样的问题。你设法解决了吗?我已经创建了另一个有关此问题的 stackoverflow 帖子,但令人惊讶的是,没有人回答看起来很基本的问题。stackoverflow.com/questions/61329524/…

标签: ruby-on-rails redis backgroundworker sidekiq


【解决方案1】:

您的要求在班级内。将它们放在类之外,以便在加载文件时立即需要它们,而不是在加载类时。

代替

class CsvImport
require "benchmark"
require 'csv'
...

这样做

require "benchmark"
require 'csv'
class CsvImport
  ...

【讨论】:

    【解决方案2】:

    尝试添加到application.rb

    config.autoload_paths += Dir["#{config.root}/app/services"]
    

    更多详情:autoload-paths

    【讨论】:

    • 自动加载路径会自动选择 app 下的任何自定义目录。例如,如果您的应用程序有 app/presenters 或 app/services 等,它们会被添加到自动加载路径中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多