【问题标题】:Rails 4 CSV upload into multiple modelsRails 4 CSV 上传到多个模型
【发布时间】:2015-07-09 20:55:05
【问题描述】:

我正在尝试上传一个 csv 文件,其中包含属于两个不同模型的数据:ProjectPurchaseOrder。我在模型之间使用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

我有两个问题/问题。

  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

【问题讨论】:

  • 哪一行是通过错误的?你能告诉我们吗?
  • 我不再收到错误消息。我的新问题是采购订单和项目之间的关联没有保存。
  • 那你有一个新问题。一个问题应该对应一个问题。

标签: ruby-on-rails ruby-on-rails-4.1


【解决方案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

【讨论】:

  • 谢谢你,史蒂夫!这会保持项目和 PO 之间的关联吗?
  • 不一定,但我已经修改了我的答案以显示一种方法。
  • 非常感谢您的解释。我感谢您的帮助。成功了!
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2013-07-16
  • 2015-02-15
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多