Проблемы с импортом CSV-файла с помощью модуля ruby ​​CSV - PullRequest
0 голосов
/ 10 сентября 2010

Я пытаюсь использовать модуль Ruby csv для импорта записей, содержащихся в файле csv, в мою локальную таблицу в приложении Ruby on Rails 3.

Таблица была создана путем создания модели Movie.

Вот что я выполняю в консоли:

require 'csv'
CSV.foreach('public/uploads/VideoTitles2.csv') do |row|
    record = Movie.new(
        :media_format   => row[0], 
        :title          => row[1], 
        :copies_at_home => row[2], 
        :order          => row[3]
    )
    record.save
end

Строки файла CSV соответствуют (в типе данных) столбцам, в которые они передаются.Вот сокращенная версия файла CSV (VideoTitles2.csv), который я пытаюсь импортировать:

"DVD","LEAP OF FAITH",1,1
"DVD","COCOON",1,2
"DVD","TITANIC",1,3

, где каждая запись разделена \ n, я полагаю.Этот CSV-файл был экспортирован из Access, и его исходное расширение файла было .txt.Я вручную изменил его на .csv для импорта.

Проблема в том, что после выполнения вышеуказанных строк в консоли rails я получаю следующий вывод:

=> nil

Импорт, кажется, не происходит.Если у кого-то есть идея относительно того, как я могу исправить это, я буду очень признателен.

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

Я не вижу проблемы. Этот фрагмент кода возвращает nil, потому что CSV.foreach возвращает nil, но это не указывает, запущен цикл или нет. Вы проверили, был ли создан Movie? Вы включили какие-либо строки отладки, чтобы следовать процессу?

Возможно, вы захотите проверить вывод record.save (или позвоните record.save!), возможно, ошибки проверки не позволяют создать запись. Также, если вы хотите, чтобы цикл возвращал созданные записи, вы можете написать это (Ruby> = 1.8.7):

require 'csv'

records = CSV.foreach('public/uploads/VideoTitles2.csv').map do |media_format, title, copies_at_home, order|     
    Movie.create!({
        media_format: media_format, 
        title: title, 
        copies_at_home: copies_at_home, 
        order: order,
    })
end
1 голос
/ 11 сентября 2010

Хорошо, было две вещи, которые я ошибся:

  1. В экспортированном файле csv не должно быть кавычек вокруг строк - я просто удалил их.

  2. Благодаря tokland, record.save!было необходимо (в отличие от записи. сохранения, которую я делал) - ошибки проверки были , препятствующие созданию записей.

Итак, после создания модели / таблицы Movie можно просто создать следующую функцию:

class Movie < ActiveRecord::Base
  attr_accessible :media_format, :title, :copies_at_home, :order
  require 'csv'

  def self.import_movies()
    CSV.foreach('public/uploads/movies.csv') do |row|
        record = Movie.new(
            :media_format   => row[0], 
            :title          => row[1], 
            :copies_at_home => row[2], 
            :order          => row[3]
        )
        record.save!  
    end
  end
end

Где movies.csv выглядит следующим образом:

Blu-ray, Movie 1, 1, 1
DVD, Movie 2, 1, 2
Blu-ray, Movie 3, 1, 3

затем вызовите эту функцию в консоли следующим образом:

Movie.import_movies()

и, как ожидается, все, что будет возвращено в консоли, будет:

=> nil

Проверьте индексное представление (если вы его создали), и вы должны увидеть, что записи были успешно импортированы в таблицу фильмов.

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