Rails 4 CSV上传到多个模型
Rails 4 CSV upload into multiple models
我正在尝试上传一个包含属于两个不同模型的数据的 csv 文件:Project
和 PurchaseOrder
。我在模型之间使用 has_many, :through
关系。
我在上传时遇到问题。我已将两个控制器中的共享属性列入白名单,并在两个模型中包含 accepts_nested_attributes
。
这是我在 csv 中读取的代码。
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
project_hash = row.to_hash
project = Project.where(project_name: project_hash["project_number"]).first
if project.present?
project.first.update_attributes(project_hash)
else
Project.create! (project_hash)
end
purchase_order = PurchaseOrder.where(po_number: project_hash["po_number"]).first
if purchase_order.present?
PurchaseOrder.create!
end
我有两个questions/problems.
我无法读取 po_number
属性。我收到此错误 unknown attribute 'po_number' for Project
.
我不知道如何将创建的采购订单推送到项目哈希中,以便更新嵌套属性值。
提前感谢任何能够提供帮助的人!
**** 更新
使用此方法,数据将保存到正确的表中。但是,不会保存 PurchaseOrder 和 Project 之间的关联。有什么想法吗?
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
project_hash = row.to_hash
po_hash = {}
po = PurchaseOrder.new
project_hash.each { |k, v| po_hash[k] = project_hash.delete(k) if po.respond_to?(k) }
project = Project.where(project_name: project_hash["project_number"]).first
if project.present?
project.first.update_attributes(project_hash)
else
Project.create! (project_hash)
end
po = PurchaseOrder.where(po_number: po_hash["po_number"]).first
if po.present?
po.first.update_attributes(po_hash)
else
PurchaseOrder.create! (po_hash)
end
end
end
这些行试图使用散列中的所有值更新/创建项目...
project.first.update_attributes(project_hash)
...
Project.create! (project_hash)
但显然有些哈希元素(例如"po_number")在项目中没有列table。
您需要根据哪些元素属于哪个模型拆分出 csv 哈希元素...
例如
po_hash = {}
po = PurchaseOrder.new
project_hash.each { |k, v| po_hash[k] = project_hash.delete(k) if po.respond_to?(k) }
这将从 project_hash
中删除采购订单字段并将它们添加到 po_hash
以便您可以使用正确的散列来更新正确的 table。
建立协会...
改变
Project.create!(project_hash)
进入
project = Project.create!(project_hash)
这样无论项目是否存在或新建,都保存在变量"project"中。同样,做
po = PurchaseOrder.create!(po_hash)
然后在您创建或更新采购订单后,您可以简单地将 po 分配给项目...
project.purchase_orders << po
我正在尝试上传一个包含属于两个不同模型的数据的 csv 文件:Project
和 PurchaseOrder
。我在模型之间使用 has_many, :through
关系。
我在上传时遇到问题。我已将两个控制器中的共享属性列入白名单,并在两个模型中包含 accepts_nested_attributes
。
这是我在 csv 中读取的代码。
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
project_hash = row.to_hash
project = Project.where(project_name: project_hash["project_number"]).first
if project.present?
project.first.update_attributes(project_hash)
else
Project.create! (project_hash)
end
purchase_order = PurchaseOrder.where(po_number: project_hash["po_number"]).first
if purchase_order.present?
PurchaseOrder.create!
end
我有两个questions/problems.
我无法读取
po_number
属性。我收到此错误unknown attribute 'po_number' for Project
.我不知道如何将创建的采购订单推送到项目哈希中,以便更新嵌套属性值。
提前感谢任何能够提供帮助的人!
**** 更新 使用此方法,数据将保存到正确的表中。但是,不会保存 PurchaseOrder 和 Project 之间的关联。有什么想法吗?
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
project_hash = row.to_hash
po_hash = {}
po = PurchaseOrder.new
project_hash.each { |k, v| po_hash[k] = project_hash.delete(k) if po.respond_to?(k) }
project = Project.where(project_name: project_hash["project_number"]).first
if project.present?
project.first.update_attributes(project_hash)
else
Project.create! (project_hash)
end
po = PurchaseOrder.where(po_number: po_hash["po_number"]).first
if po.present?
po.first.update_attributes(po_hash)
else
PurchaseOrder.create! (po_hash)
end
end
end
这些行试图使用散列中的所有值更新/创建项目...
project.first.update_attributes(project_hash)
...
Project.create! (project_hash)
但显然有些哈希元素(例如"po_number")在项目中没有列table。
您需要根据哪些元素属于哪个模型拆分出 csv 哈希元素...
例如
po_hash = {}
po = PurchaseOrder.new
project_hash.each { |k, v| po_hash[k] = project_hash.delete(k) if po.respond_to?(k) }
这将从 project_hash
中删除采购订单字段并将它们添加到 po_hash
以便您可以使用正确的散列来更新正确的 table。
建立协会...
改变
Project.create!(project_hash)
进入
project = Project.create!(project_hash)
这样无论项目是否存在或新建,都保存在变量"project"中。同样,做
po = PurchaseOrder.create!(po_hash)
然后在您创建或更新采购订单后,您可以简单地将 po 分配给项目...
project.purchase_orders << po