将数据从csv导入rails应用程序

时间:2018-05-05 11:35:46

标签: ruby-on-rails ruby

  

我正在尝试使用Classes将数据从CSV导入到数据库中,以便我可以轻松地为我创建的csv导入rake任务编写测试用例

但是,我的解决方案不起作用

我也觉得:

  1. 没有意义
  2. 除了感觉它不是一个很好的解决方案,意味着Ruby掌握,它不起作用。
  3. 以下是我在 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?

2 个答案:

答案 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文件应该在您的项目根文件夹中