1

我尝试基于以下实现 CSV 导入功能: Rails Cast Import CSV

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

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

我没有经验,我认为可能解决这个问题的方法是删除所有记录并重建它们。但显然,这样做会出现性能问题。

所以,我想请教你们如何解决这样的问题。

4

3 回答 3

2

看起来您需要排除查询。

您可以将 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 导入。

于 2013-02-21T09:21:47.103 回答
1

@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

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

于 2013-02-21T09:18:01.863 回答
0

如果您基于 CSV 文件更新记录(您只想让记录出现在 CSV 文件中),您可以先删除所有记录,然后从 CSV 文件插入记录。您可以使用smarter_csv gem 允许后台处理。

于 2013-02-23T11:18:18.277 回答