1. ホーム
  2. ruby-on-rails-3

[解決済み] 複数の列に基づいて重複するレコードを削除しますか?

2023-08-18 20:56:14

質問

Herokuを使ってRuby on Railsアプリケーションをホストしていますが、何らかの理由で行が重複している可能性があります。

2つ以上の基準に基づいて重複するレコードを削除し、その重複するコレクションの1つのレコードだけを維持する方法はありますか?

私の使用例では、データベースに車のメーカーとモデルの関係があります。

Make      Model
---       ---
Name      Name
          Year
          Trim
          MakeId

私は、同じ名前、年、およびトリムを持つすべてのモデルレコードを削除したいのですが、それらのレコードの1つを保持します(つまり、私はレコードが必要ですが、一度だけです)。私はHerokuコンソールを使用しているので、いくつかのアクティブなレコードのクエリを簡単に実行することができます。

何か提案はありますか?

どのように解決するのですか?

class Model

  def self.dedupe
    # find all models and group them on keys which should be common
    grouped = all.group_by{|model| [model.name,model.year,model.trim,model.make_id] }
    grouped.values.each do |duplicates|
      # the first one we want to keep right?
      first_one = duplicates.shift # or pop for last one
      # if there are any more left, they are duplicates
      # so delete all of them
      duplicates.each{|double| double.destroy} # duplicates can now be destroyed
    end
  end

end

Model.dedupe

  • すべてを検索
  • 一意性のために必要なキーでグループ化する。
  • グループ化されたモデルのハッシュの値でループを回す
  • コピーを1つ保持したいので、最初の値を削除します。
  • 残りを削除