【问题标题】:Rails Import CSV records Delete all and RecreateRails 导入 CSV 记录 全部删除并重新创建
【发布时间】:2013-02-21 08:55:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在导入之前,您可以将现有记录的所有 id 保存到一个数组中,并且在逐行处理 csv 时,对于每个处理过的记录,相应的 id 都会从该数组中删除。之后您可以处理留在数组中的 id,因为这些记录不包含在您的 csv 中

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


【解决方案1】:

您似乎需要排除查询。

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

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 导入。

【讨论】:

    【解决方案2】:

    @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
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 2016-11-24
        • 2020-09-28
        • 1970-01-01
        相关资源
        最近更新 更多