Om dataintegriteten är kritisk bör du inte använda en validering för att garantera unikhet. Det kan misslyckas. Det enda sättet att garantera unikhet är att använda en databasrestriktion. Detta beror på att Rails validates_uniqueness
kan ha tävlingsförhållanden.
Skapa en migrering för att lägga till indexet, eller ändra din befintliga för att återspegla denna ändring:
För ett nytt 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
För en befintlig tabell:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Nu kan du gå vidare och lägga till en validering, som andra har föreslagit, om du vill ge dina användare feedback om att de redan har röstat:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }