我在使用CSV进入我的应用程序时遇到了一些麻烦,我想用它来更新现有的和创建记录。我的CSV数据只有两个标题日期和总计。我在我的模型中创建了一个导入方法,它创建了所有内容但是如果我可以使用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
我希望我能正确理解这一点。如下面的评论中所发现,CSV日期格式为DD-MM-YYYY,数据库将日期存储为YYYY-MM-DD。
答案 0 :(得分:1)
正如我们在问题的评论主题中找到的那样,日期以yyyy-mm-dd格式保存到数据库中。
从CSV文件中读取的日期采用mm-dd-yyyy格式。使用此格式执行find_by时从不返回结果,因为格式与数据库中使用的格式不同。
Date.parse会将从CSV文件中读取的字符串转换为真正的Date对象,该对象可以与存储在数据库中的日期进行比较。
所以,而不是:
entry = find_by(Date: row["Date"]) || new
使用:
entry = find_by(Date: Date.parse(row["Date"])) || new