Se a integridade dos dados for crítica, você não deve usar uma validação para garantir a exclusividade. Pode falhar. A única maneira de garantir a exclusividade é usar uma restrição de banco de dados. Isso ocorre porque o Rails
validates_uniqueness
pode ter condições de corrida. Crie uma migração para adicionar o índice ou altere a existente para refletir essa alteração:
Para uma nova tabela:
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 uma tabela existente:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Agora você pode ir em frente e adicionar uma validação, conforme sugerido por outros, se quiser dar ao seu usuário feedback de que ele já votou:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }