我尝试基于以下实现 CSV 导入功能: Rails Cast Import CSV
它非常适合通过根据 ID 查找记录并编辑或创建记录来更新和插入新记录。
但是,它不考虑从 CSV 文件中删除的记录。
我没有经验,我认为可能解决这个问题的方法是删除所有记录并重建它们。但显然,这样做会出现性能问题。
所以,我想请教你们如何解决这样的问题。
我尝试基于以下实现 CSV 导入功能: Rails Cast Import CSV
它非常适合通过根据 ID 查找记录并编辑或创建记录来更新和插入新记录。
但是,它不考虑从 CSV 文件中删除的记录。
我没有经验,我认为可能解决这个问题的方法是删除所有记录并重建它们。但显然,这样做会出现性能问题。
所以,我想请教你们如何解决这样的问题。
看起来您需要排除查询。
您可以将 row_ids 收集到一个数组中,然后删除所有记录
ids = []
CSV.foreach(file.path, headers: true) do |row|
ids << row["id"]
end
Topic.where('id not in (?)',ids).delete_all
仅供参考:如何使用 ActiveRecord/Rails 表达 NOT IN 查询?
在此之后,您可以运行正常的 csv 导入。
@Jethroo 的建议非常好。您也可以在处理它们时将要添加的项目的 ID 添加到数组中,然后遍历现有记录,如果不在已处理的数组中,则删除。FE:
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
不确定这是否是最有效的方法,因为您必须直接遍历所有对象:/。
如果您基于 CSV 文件更新记录(您只想让记录出现在 CSV 文件中),您可以先删除所有记录,然后从 CSV 文件插入记录。您可以使用smarter_csv gem 允许后台处理。