我尝试实施基于以下内容的CSV导入功能: Rails Cast Import CSV
通过根据其ID查找记录并编辑或创建记录,它非常适合更新和插入新记录。
但是,它没有考虑从CSV文件中删除的记录。
我缺乏经验,我想到的可能解决这个问题的方法是删除所有记录并重建它们。但很明显,这会有性能问题。
所以,我想就你们如何解决这个问题提出建议。
答案 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来进行后台处理。