Pokud je integrita dat kritická, neměli byste používat ověřování k zaručení jedinečnosti. Může selhat. Jediným způsobem, jak zaručit jedinečnost, je použití databázového omezení. Je to proto, že Rails validates_uniqueness
může mít závodní podmínky.
Chcete-li přidat index, vytvořte migraci nebo změňte svůj stávající tak, aby odrážel tuto změnu:
Pro novou tabulku:
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
Pro existující tabulku:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Nyní můžete pokračovat a přidat ověření, jak navrhli ostatní, pokud chcete svým uživatelům poskytnout zpětnou vazbu, že již hlasovali:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }