2015-07-09 15 views
3

我试图上载有一个属于两个不同的模型数据的csv文件:ProjectPurchaseOrder。我正在使用模型之间的has_many, :through关系。轨道4 CSV上传到多个模型

我遇到了上传问题。我已将两个控制器中的共享属性列入白名单,并且在两种型号中均包含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 

我有两个问题/问题。

  1. 我无法读取po_number属性。我得到这个错误unknown attribute 'po_number' for Project

  2. 我不知道如何创建的采购订单推入项目的哈希,以便更新嵌套的属性值。

预先感谢任何能够帮助的人!

****更新 通过这种方法,数据被保存到正确的表。但是,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 
+0

哪条线是通过错误?你能告诉我们吗? – ABMagil

+0

我不再收到错误。我的新问题是,采购订单和项目之间的关联没有保存。 – pa71

+0

然后你有一个新的问题。一个问题应该与一个问题相对应。 – ABMagil

回答

1

这些线路试图更新/使用散列所有值创建项目...

project.first.update_attributes(project_hash) 
... 
Project.create! (project_hash) 

但显然有些散元素(如“PO_NUMBER”)不具备项目表中的列。

您需要在此基础上分裂出来的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这样你就可以使用正确的哈希更新正确的表。

建立关联...

变化

Project.create!(project_hash) 

project = Project.create!(project_hash) 

这样不管项目是否存在,或者是新创建的,它存储在变量“项目”。同样,做

po = PurchaseOrder.create!(po_hash) 

已创建或更新采购订单,您可以简单地婆分配给项目再经过...

project.purchase_orders << po 
+0

谢谢,史蒂夫!这会保持项目和采购订单之间的关联吗? – pa71

+0

不一定,但我修改了我的答案,以显示一种方法来做到这一点。 – SteveTurczyn

+0

非常感谢您的解释。我感谢您的帮助。有效! – pa71