zoonman
@zoonman
⋆⋆⋆⋆⋆

Как делается импорт данных в Rails?

Есть таблица музыка, в ней хранится данные ввиде
music
- artist_id
- album_id
- title
- length
- picture_id
- uploader_id
и т.д.

Соответственно, есть ряд зависимых таблиц - исполнители, альбомы и т.д. Обычная реляционная схема.
Данные в CSV выглядят в стиле
Артист,Альбом,Название,Длина, и т.д
С парсингом CSV я вроде разобрался, нашел Roo. Понятное дело, что картинок в файле нет, это на будущее.
Uploader_id - это ссылка на пользователя, который загружает файл.
Вот загвоздка в том, как делается импорт с рассовыванием данных по разным моделям. С исключением дублирования и т.п.
Я нашел пример, но там все с примитивной моделью было, а тут все несколько сложнее.
Интересно, как это делается в принципе. Но лучше какой-то конкретный пример, чтобы код почитать (если не очень сложный).
Я привык на PHP & Perl все это вручную делается, в Rails тут все несколько абстрактнее и я не всегда понимаю, что происходит.
  • Вопрос задан
  • 2361 просмотр
Пригласить эксперта
Ответы на вопрос 1
@vsuhachev
Мне для парсинга всегда хватало CSV из стандартной библиотеки ruby.

Я в подобной ситуации делал так:
Закачивал все csv-файлы в память, готовил индексы для связывания (в Hash) и потом с помощью методов create, build и save создавал объекты, связывая их.

Пример:
transaction do

albums = {}

album_csv.each do |line|
  raise "errrrr" if albums.has_key? line.title
  albums[line.title] = Album.create!(title: line.title)
end

artist_csv.each do |line|
  artist = Artist.new(title: line.title)
  artist.album = albums[line.album] or fail "no album: #{line.album}"
  artist.save!
end

end


Если объем данных велик, то делаем все то же самое но закачиваем данные не в память а во временные таблицы в БД.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы