У меня есть структурированный файл с разделителями-запятыми, в котором есть два типа записей. Различные записи различаются заголовком: 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-образ действий. Мне было бы интересно услышать, как более опытные программисты решат эту проблему. Спасибо за ваш вклад.