如果存在于rails 4中,则导入CSV并更新记录

时间:2015-09-09 13:23:01

标签: ruby-on-rails csv ruby-on-rails-4

型号:

def self.import(csv_file)
    line = 2
    errors = []

    CSV.foreach(csv_file, headers: true) do |row|
      order = Order.find_or_initialize_by(projectid: row["projectid"], batch: row["batch"])
      order.assign_attributes(row.to_hash)
      if order.valid?
        order.save!
      else
        errors << line
      end

      line += 1
    end

    return errors
  end

这是基于以下建议的更新型号代码;非常感谢Daiku和madcow到目前为止。

我认为记录没有更新的原因与order.assign_attributes(row.to_hash)有关,基于测试另一个,我在控制台中使用了上面的代码,但是硬值。

我正在尝试查看该代码现在正在做什么。

3 个答案:

答案 0 :(得分:0)

思路:

  1. 不确定上下文但如果用例包括更新现有batch的{​​{1}},则project_id找不到现有项目,因为它正在查找记录两者相同的find_or_initialize_byproject_id

  2. batch是拼写错误吗?它应该是projectid吗?

  3. 更新:

    此外,你应该在foreach循环中有一个project_id,否则它会提前中止。

答案 1 :(得分:0)

这应该有效。更新将尝试在更新之前保存该项目,以便它可以处理新记录以及找到的记录。

def self.import(csv_file)
  CSV.foreach(csv_file, headers: true) do |row|
    order = Order.find_or_initialize_by(projectid: row["projectid"], batch: row["batch"])
    if order.update(row.to_hash)
      true
    else
      false
    end
  end
end

答案 2 :(得分:0)

答案是多方面的,Madcow,Daiku和Jake在某种程度上都有一部分。

原帖中的更新代码现在非常有效。我在我上传的csv文件中放了一个id列,认为它需要在那里工作。它不需要在那里,事实上它不需要在那里。

{“id”=&gt; nil,“projectid”=&gt;“IADTST1RWKP01”,“batch”=&gt;“1”,“ppiho”=&gt;“2015-11-02”,“needby”= &gt;“2015-10-02”,“quantity”=&gt;“192”,“manufacturer”=&gt;“Delta”,“model”=&gt;“US Cords”,“CAR”=&gt; nil,“ cfnum“=&gt; nil,”prnum“=&gt; nil,”ponum“=&gt; nil,”status“=&gt;”报价已完成“,”联系人“=&gt;”Mike Salafia“,”notes“=&gt; ;零}

当该哈希被呈现给订单时,它拒绝了它,因为id试图设置为nil并且它不能为零。但是,我不需要csv文件中的id来查找订单并更新它或创建新订单,因为projectid和batch可以用于查找并且id是自动分配的。

所以我需要回归,Daiku让我更难看哈希,而杰克的代码也可能有用。