ActiveRecord `from_csv` метод - как сделать его более сексуальным?

Я написал метод для загрузки данных в БД из CSV. Для меня это немного несерьезно и далеко от СУХОГО:

  def self.from_csv(data)
    c = Company.new
    FasterCSV.parse(data) do |row|
      c.name = row[0]
      c.street = row[1]
      c.street_number = row[2]
      c.apartament_number = row[3]

      c.city = row[4]
      c.post_code = row[5]
      c.post_office_city = row[6]

      c.nip = row[7]
      c.regon = row[8]
      c.vatin = row[9]
    end
  end

Как сделать его более сексуальным или, может быть, уже есть какая-нибудь библиотека для загрузки данных?

3 ответа

Решение

Вы можете поместить сексуальную леди сверху этого:

#          ___
#   _  _.-"_< }
#    ""--"" 7(
#          /())
#         / )/
#        ^ ( \
#          / /
#         /.'
#        //
# ______/L___ sexii
def self.from_csv(data)
  #...
end

Но, если серьезно, единственная проблема, которую я вижу с вашим кодом, заключается в том, что вы не можете легко переставить атрибуты, потому что вам придется вручную обновлять все индексы. Я бы предпочел иметь упорядоченный список атрибутов в массиве и использовать динамический вызов некоторых методов Ruby:

def self.from_csv(data)
  company = new
  row = CSV.parse_line(data)
  [:name, :street, :street_number, :apartament_number,
   :city, :post_code, :post_office_city,
   :nip, :regon, :vatin].each_with_index do |name, i|
    company.send(:"#{name}=", row[i])
  end
  company
end

Также обратите внимание, что вам нужно вернуть созданный экземпляр компании в конце, иначе вы получите случайное значение при вызове Company.from_csv,

c = Company.new
cols = ["name", "street", "street_number", "apartament_number", "city", "post_code", "post_office_city", "nip", "regon", "vatic"]

FasterCSV.parse(data) do |row|
  cols.each_index { |i| c.send("#{cols[i]}=", row[i]) }
end

Я написал эту облегченную оболочку для загрузки файлов CSV:

https://github.com/stackpilot/loady

Он работает с ruby ​​1.9 и использует стандартную библиотеку ruby ​​CSV (ранее известную как FasterCSV).

Вы делаете это с этим:

Loady.csv "/your/file.csv" do |row|
  Company.create row.to_attributes [:name, :street, :street_number, ...]
end
Другие вопросы по тегам