【发布时间】:2014-02-01 12:38:01
【问题描述】:
我在将 CSV 导入我的应用程序时遇到了一些麻烦,我想用它来更新现有记录和创建记录。我的 CSV 数据只有两个标题 Date 和 Total。我在我的模型中创建了一个导入方法,它创建了所有内容,但如果我可以 CSV 并上传它不会更新现有记录,它只会创建重复项?
这是我的方法,如您所见,一旦使用 find_by 匹配,我将按日期标题查找行,然后在返回 false 时创建新记录,如果匹配,则使用当前行中的数据进行更新,但那不似乎不是这样,我只是得到重复的行。
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
entry = find_by(Date: row["Date"]) || new
entry.update row.to_hash
entry.save!
end
end
我希望我理解正确。在下面的 cmets 中发现,CSV 日期格式为 DD-MM-YYYY,数据库将日期存储为 YYYY-MM-DD。
【问题讨论】:
-
您是否尝试过改用
find_by(date: row["Date"])? ruby 中的命名约定表示属性是小写的。 -
@UriAgassi 感谢 Uri 的回复,我已经进行了调整,但仍然得到相同的结果:(
-
数据库中的日期字段和 CSV 中的日期格式是否相同?数据库字段是日期时间字段还是字符串?
-
@NathanFritz 我刚刚检查过,我的 CSV 中的日期是 01-02-2014 并且在数据库中它是作为 2014-02-01 导入的,这有什么区别吗?它正在导入数据库但只是不更新现有记录,它被设置为日期。感谢回复!
-
我怀疑虽然它在保存之前将日期转换为数据库的正确格式,但与该日期和不同格式的日期的比较会失败。尝试做 find_by(date: Date.parse(row["Date"])) 有帮助吗?
标签: ruby csv ruby-on-rails-4