0

CSVからDBにデータをロードするメソッドを作成しました。私にとって、それは少しセクシーではなく、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
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 に答える
1

CSVファイルをロードするためにこの軽量ラッパーを作成しました。

https://github.com/stackpilot/loady

これはruby1.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 に答える