Si l'intégrité des données est critique, vous ne devez pas utiliser une validation pour garantir l'unicité. Cela peut échouer. La seule façon de garantir l'unicité est d'utiliser une contrainte de base de données. C'est parce que les Rails validates_uniqueness
peut avoir des conditions de concurrence.
Créez une migration pour ajouter l'index, ou modifiez votre existant pour refléter ce changement :
Pour un nouveau tableau :
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
Pour une table existante :
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Vous pouvez maintenant continuer et ajouter une validation, comme d'autres l'ont suggéré, si vous souhaitez donner à votre utilisateur des commentaires sur le fait qu'il a déjà voté :
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }