5

Import CSV Railscastに従っていますが、簡単です。

問題は、1 つのファイルに 1 つのモデルの情報のみを含む csv ファイルのみを処理することです。

Listingたとえば、モデルにインポートしようとしている CSV ファイルがあるとします。各行/リストにはBuilding、値が実際にはそのリストの建物属性の名前 (つまり@listing.building.name) であるという列があります。

インポートでこれらのケースをどのように処理しますか?

これは、Ryan が Railscast に入れるクローゼットでProduct、彼のケースのモデルにあります。

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    product = find_by_id(row["id"]) || new
    product.attributes = row.to_hash.slice(*accessible_attributes)
    product.save!
  end
end

起こっていることは、製品が存在するかどうかを確認し、存在する場合は属性を更新することだけです。そうでない場合は、新しいものを作成します。

この場合の関連付けの処理方法がよくわかりません...特に、関連付けられたレコードが存在しない場合に必要なことを考えると、このプロセス中に作成する必要があります。

前の例に戻ると、building.nameがない場合はBuilding.find_by_name(name)、新しい建物レコードを作成する必要があります。

考え?

4

1 に答える 1

2

これを試して

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    product = find_by_id(row["id"]) || new
    product.attributes = row.to_hash.slice(*accessible_attributes)
    product.save!

    building = product.buildings.find_by_name(row['building_name'])
    building ||= product.buildings.build
    building.attributes = row.to_hash.slice(*build_accessible_attributes)
    building.save!
  end
end

更新: 新しいレール 3 メソッドを使用して回答を更新しました

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    product = where(id: row["id"])
      .first_or_create!(row.to_hash.slice(*accessible_attributes))

    product.buildings.where(name: row['building_name'])
      .first_or_create!(row.to_hash.slice(*building_accessible_attributes))
  end
end
于 2013-02-01T08:32:45.487 に答える