导入CSV数据以使用Rails更新现有记录

时间:2014-02-01 12:38:02

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

我在使用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。

1 个答案:

答案 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