0

我已经编写了将数据从 CSV 加载到数据库的方法。对我来说,这有点不性感,而且离 DRY 还很远:

  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

如何让它更性感,或者可能已经有任何库来加载数据?

4

3 回答 3

6

你可以在上面放一位性感的女士:

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

于 2012-01-15T14:09:36.957 回答
1

我编写了这个轻量级包装器来加载 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
于 2012-01-17T04:54:26.380 回答
1
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
于 2012-01-15T13:48:13.157 回答