Se l'integrità dei dati è fondamentale, non dovresti utilizzare una convalida per garantire l'unicità. Può fallire. L'unico modo per garantire l'unicità è utilizzare un vincolo di database. Questo perché Rails validates_uniqueness
può avere condizioni di gara.
Crea una migrazione per aggiungere l'indice o modifica quella esistente per riflettere questa modifica:
Per una nuova tabella:
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
Per una tabella esistente:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Ora puoi procedere e aggiungere una convalida, come suggerito da altri, se vuoi dare ai tuoi utenti un feedback che hanno già votato:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }