PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie stelle ich sicher, dass meiner Datenbanktabelle keine doppelten Zeilen über activerecords hinzugefügt werden?

Wenn die Datenintegrität kritisch ist, sollten Sie keine Validierung verwenden, um die Eindeutigkeit zu gewährleisten. Es kann scheitern. Die einzige Möglichkeit, Eindeutigkeit zu gewährleisten, ist die Verwendung einer Datenbankeinschränkung. Das liegt daran, dass Rails validates_uniqueness kann Rennbedingungen haben.

Erstellen Sie eine Migration, um den Index hinzuzufügen, oder ändern Sie Ihre vorhandene, um diese Änderung widerzuspiegeln:

Für eine neue Tabelle:

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

Für eine vorhandene Tabelle:

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

Jetzt können Sie fortfahren und eine Validierung hinzufügen, wie von anderen vorgeschlagen, wenn Sie Ihren Benutzern Feedback geben möchten, dass sie bereits abgestimmt haben:

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