我正在尝试使用Classes将数据从CSV导入到数据库中,以便我可以轻松地为我创建的csv导入rake任务编写测试用例
但是,我的解决方案不起作用。
我也觉得:
以下是我在 engines / csv_importer / lib / tasks / csv_import.rake中提出的内容
require 'open-uri'
require 'csv'
namespace :csv_import do
desc 'Import users from csv'
task users: :environment do
WebImport.new(url: 'http://blablabla.com/details/people.csv').call.answers
end
end
class WebImport
def initialize(url)
@csv_string = url
end
def call
CSV.parse(@csv_string, headers: true, header_converters: :symbol) do |row|
next unless row[:name].present? && row[:email_address].present?
end
CsvImporter::User.create row.to_h
end
def self.answers
user = []
counter = 0
duplicate_counter = 0
user.persisted? ? counter + 1 : duplicate_counter + 1
p "Email duplicate record: #{user.email_address} - #{user.errors.full_messages.join(',')}" if user.errors.any?
p "Imported #{counter} users, #{duplicate_counter} duplicate rows ain't added in total"
end
end
运行rake csv_import:用户
时出错$ rake csv_import:users
rake aborted!
NoMethodError: private method `gets' called for {:url=>"http://blablabla.com/details/people.csv"}:Hash
从长远来看,我如何让这项工作 和 为此编写TEST?
答案 0 :(得分:2)
您收到此错误是因为您在method accepts a string时将哈希值传递给CSV.parse
。
要解决此问题,您需要将参数从哈希值更改为字符串:WebImport.new('http://blablabla.com/details/people.csv')
并在将其传递给CSV.parse
之前读取远程CSV文件,例如:CSV.parse(open(url))
。
答案 1 :(得分:0)
您可以尝试使用
rake db:seed
使用种子文件
将数据导入数据库require 'csv'
puts "Importing data..."
CSV.foreach(Rails.root.join("file_name.csv"), headers: true) do |row|
Model_name.create! do |model_name|
model_name.name = row[0]
model_name.email_address = row[1]
end
end
csv文件应该在您的项目根文件夹中