2017-02-15 3 views
0

У меня есть служебный объект CsvImport в моем app/services, и я пытаюсь вызвать один из методов класса из рабочего.Rails + Sidekiq не распознающий класс

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' безрезультатно.

Heres, где он ломает:

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 
+0

Вы можете разместить этот файл, 'CsvImport'? – Iceman

+1

Я отправил класс/метод, вызываемый для краткости. @Iceman – gemart

+0

Какую версию Rails вы используете? – Iceman

ответ

-1

Try добавить в application.rb

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

Более подробную информацию здесь: autoload-paths

0

Ваши требования входят в класс. Поместите их за пределы класса, чтобы они сразу требовались, когда файл загружен, а не когда класс загружен.

Вместо

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

ли это

require "benchmark" 
require 'csv' 
class CsvImport 
    ... 
Смежные вопросы