ActiveRecord `from_csv` метод - как сделать его более сексуальным? - PullRequest
0 голосов
/ 15 января 2012

Я написал метод для загрузки данных в БД из 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 ]

6 голосов
/ 15 января 2012

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

#          ___
#   _  _.-"_< }
#    ""--"" 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.

1 голос
/ 17 января 2012

Я написал эту облегченную оболочку для загрузки файлов 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
1 голос
/ 15 января 2012
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
...