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