sql >> データベース >  >> RDS >> PostgreSQL

重複する行がactiverecordsを介してデータベーステーブルに追加されないようにするにはどうすればよいですか?

    データの整合性が重要な場合は、一意性を保証するために検証を使用しないでください。失敗する可能性があります。一意性を保証する唯一の方法は、データベース制約を使用することです。これは、Railsがvalidates_uniquenessであるためです。 競合状態になる可能性があります。

    移行を作成してインデックスを追加するか、既存のインデックスを変更してこの変更を反映します。

    新しいテーブルの場合:

    class CreateVotes < ActiveRecord::Migration
      def change
        create_table :votes do |t|
          t.belongs_to :voter
          t.belongs_to :votefor
          t.string :vote # Choose the correct column type
          t.timestamps
        end
        add_index :votes, [:voter_id, :votefor_id, :vote], unique: true
      end
    end
    

    既存のテーブルの場合:

    class AddUniqueIndexToVotes < ActiveRecord::Migration
      def change
        add_index :votes,  [voter_id, votefor_id, vote], unique: true
      end
    end
    

    これで、他のユーザーがすでに投票したというフィードバックをユーザーに提供したい場合は、他のユーザーが提案したように、先に進んで検証を追加できます。

    validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }
    


    1. Django文字セットとエンコーディング

    2. mysqlクエリでインデックスを効率的に使用する方法

    3. SQLで保持率を計算する方法は?

    4. データベース監視の役割を揺るがすのに役立つ5つの優れたリソース