型号:
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)有关,基于测试另一个,我在控制台中使用了上面的代码,但是硬值。
我正在尝试查看该代码现在正在做什么。
答案 0 :(得分:0)
思路:
不确定上下文但如果用例包括更新现有batch
的{{1}},则project_id
找不到现有项目,因为它正在查找记录两者相同的find_or_initialize_by
和project_id
。
batch
是拼写错误吗?它应该是projectid
吗?
更新:
此外,你应该在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让我更难看哈希,而杰克的代码也可能有用。