Hvis dataintegritet er kritisk, bør du ikke bruge en validering for at garantere unikhed. Det kan fejle. Den eneste måde at garantere unikhed på er at bruge en databasebegrænsning. Dette skyldes, at Rails validates_uniqueness
kan have løbsforhold.
Opret en migrering for at tilføje indekset, eller skift dit eksisterende for at afspejle denne ændring:
For et nyt bord:
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
For en eksisterende tabel:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Nu kan du gå videre og tilføje en validering, som foreslået af andre, hvis du vil give din brugerfeedback om, at de allerede har stemt:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }