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 に答える