Что такое Ruby on Rails-способ импорта структурированного файла с разделителями-запятыми и последующего создания записей Activerecord

У меня есть структурированный файл с разделителями-запятыми, в котором есть два типа записей. Различные записи различаются заголовком: H или P. Формат файла следующий:

"H","USA","MD","20904"
"P","1","A","Female","W"
"P","2","A","Male","H"

Я хочу импортировать файл, а затем создать модели активной записи с импортированными данными. Подход, который я использую, заключается в создании карты полей, которая включает количество полей, имя объекта и столбцы.

Затем я использую карту поля

$ field_map =

{
  'H'   =>
    {
      :count => 4,
      :object => :Header,
      :cols => [:record_type, :country_id, :state, :zip]
    },

  'R'   =>
    {
      :count => 4,
      :object => :RaceData,
      :cols => [:record_type, :household_size, :gender, :race]
    }
}

Затем я использую FastCSV для импорта файла и использую оператор case для определения того, как файл будет преобразован, а затем использован в операторах create activerecord.

FasterCSV.foreach(filename) do |row|
    tbl_type = row[0]
    tbl_info = $field_map[tbl_type]

   unless (tbl_info.nil?)
     field_no = tbl_info[:count]
     object = tbl_info[:object]
     columns = tbl_info[:cols]
     record_type = new_record[:record_type]
     case record_type
         when "H"
         factory_build_h_record(new_record)
         when "P"
         factory_build_p_record(new_record)
     end
   end
 end

Приведенный выше код резюмирован из-за нехватки места. Мой подход работает отлично, но я новичок в Ruby и меня всегда интересуют лучшие практики и «истинный» Ruby-образ действий. Мне было бы интересно услышать, как более опытные программисты решат эту проблему. Спасибо за ваш вклад.


person Mutuelinvestor    schedule 12.02.2013    source источник
comment
К вашему сведению, если вы используете Ruby 1.9, нет необходимости использовать FasterCSV, поскольку встроенная библиотека CSV Ruby 1.9 - это FasterCSV.   -  person Andrew Marshall    schedule 12.02.2013
comment
Спасибо. Я только что проверил свою версию, а у меня все еще 1.8.7. Возможно, пришло время обновиться.   -  person Mutuelinvestor    schedule 12.02.2013


Ответы (1)


Я предлагаю gem 'roo'

У вас есть пример исходного кода здесь, но я предпочитаю смотреть 10 минут видео

person Helio Santos    schedule 12.02.2013