импорт данных из csv в приложение rails - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь импортировать данные из CSV в базу данных, используя классы, чтобы я мог легко написать контрольный пример для созданной мной задачи по рейку импорта csv

Однако мое решение не работает .

И я тоже чувствую:

  1. Это не имеет смысла
  2. Помимо ощущения, что это не очень хорошее решение, связанное с мастерством Ruby, оно не работает.

Вот что я придумал в моих engine / 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

Как мне заставить это работать и написать ТЕСТ для этого в долгосрочной перспективе?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете попробовать использовать

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-файл должен находиться в корневой папке вашего проекта

0 голосов
/ 05 мая 2018

Вы получаете эту ошибку, потому что вы передаете хэш CSV.parse, в то время как метод принимает строку .

Чтобы исправить это, вам нужно изменить аргумент из хэша в строку: WebImport.new('http://blablabla.com/details/people.csv') и прочитать удаленный CSV-файл перед передачей его в CSV.parse, например: CSV.parse(open(url)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...