我正在尝试通过sidekiq
导入一个大型csv。但我面临着问题。
我在我的控制器中编写了import
方法。
def import
Importcsv.perform_async(params[:file])
redirect_to calendars_path, notice: "Calendar imported."
end
工人代码在这里。
class Importcsv
include Sidekiq::Worker
sidekiq_options queue: "high"
def perform(file)
CSV.foreach(file.path, headers: true) do |row|
calendar = find_by_id(row['id']) || new
calendar.attributes = row.to_hash
calendar.save
end
end
end
但我收到此错误undefined method
路径' for" / tmp / RackMultipart20150928-8812-sgwsm5":String`
答案 0 :(得分:1)
您的错误日志表明,您正试图从path
的实例获取String
。您可以尝试以下代码:
def perform(file)
file = file.path if file.is_a?(File)
CSV.foreach(file, headers: true) do |row|
# ...
end
end
这样,您可以在此方法中接受String
和File
参数。另请注意,在使用Sidekiq时,您无法将File
作为参数传递。请详细了解here。
答案 1 :(得分:0)
我通过传递单行解决了这个问题,例如
CSV.foreach(params[:file].path, headers: true) do |row|
attrs ={name: row[0]}
Importcsv.perform_async(attrs)
end