Si la integridad de los datos es fundamental, no debe utilizar una validación para garantizar la exclusividad. Puede fallar. La única forma de garantizar la unicidad es usar una restricción de base de datos. Esto se debe a que Rails validates_uniqueness
puede tener condiciones de carrera.
Cree una migración para agregar el índice o cambie el existente para reflejar este cambio:
Para una nueva tabla:
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
Para una tabla existente:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Ahora puede continuar y agregar una validación, como lo sugirieron otros, si desea dar a su usuario comentarios de que ya votaron:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }