Rails导入CSV记录全部删除并重新创建

时间:2013-02-21 08:55:46

标签: ruby-on-rails ruby ruby-on-rails-3 csv import

我尝试实施基于以下内容的CSV导入功能: Rails Cast Import CSV

通过根据其ID查找记录并编辑或创建记录,它非常适合更新和插入新记录。

但是,它没有考虑从CSV文件中删除的记录。

我缺乏经验,我想到的可能解决这个问题的方法是删除所有记录并重建它们。但很明显,这会有性能问题。

所以,我想就你们如何解决这个问题提出建议。

3 个答案:

答案 0 :(得分:2)

您似乎需要排除查询。

您可以将row_id收集到一个数组中,然后删除所有记录

ids = []
CSV.foreach(file.path, headers: true) do |row|
 ids << row["id"]
end

Topic.where('id not in (?)',ids).delete_all

仅供参考:How to express a NOT IN query with ActiveRecord/Rails?

在此之后,您可以运行正常的csv导入。

答案 1 :(得分:1)

@ Jethroo的建议非常好。您还可以在处理数组时添加要添加到数组中的项目的ID,然后运行现有记录并删除(如果不在已处理数组中)。 F.E:

processed_ids = []
@csv_row.each do |r|
  process r
  processed_ids << r[:id]
end

Object.all.each do |o|
  next if processed_ids.include? o.id
  o.destroy
end

不确定这是否是最有效的方式,因为您必须直接浏览所有对象:/。

答案 2 :(得分:0)

如果要根据CSV文件更新记录(您只想在CSV文件中显示记录),则可以先删除所有记录,然后从CSV文件中插入记录。您可以使用smarter_csv gem来进行后台处理。