轨道上的红宝石 - 导入 CSV 时,如何处理与关联对应的行中的数据



我正在遵循导入CSV轨道广播,它很简单。

问题是它只处理一个 csv 文件,其中包含 1 个文件中 1 个模型中的信息。

假设我有一个 CSV 文件,我正在尝试将其导入到我的Listing模型中。在每个行/列表上,它都有一个名为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),那么它应该创建一个新的建筑记录。

思潮?

试试这个

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

相关内容

  • 没有找到相关文章

最新更新