当导入CSV,我怎么在对应的关联处理一行数据?(When importing a CSV, how

2019-07-19 02:40发布

我下面的导入CSV Railscast ,它是直线前进。

问题是,它与含1个模型1个文件只信息只是一个CSV文件的交易。

我说,我有我试图导入到我的CSV文件Listing模式。 在每一行/列表它有一个名为列Building其中的值实际上是上市的建筑物属性(即名称@listing.building.name )。

如何处理在进口的情况下?

这是瑞安获得在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) ,那么它应该创建一个新的建设纪录。

思考?

Answer 1:

试试这个

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

更新:使用新的Rails 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


文章来源: When importing a CSV, how do I handle data in a row that corresponds to an association?