Als gegevensintegriteit van cruciaal belang is, moet u geen validatie gebruiken om uniciteit te garanderen. Het kan mislukken. De enige manier om uniciteit te garanderen, is door een databasebeperking te gebruiken. Dit komt omdat de Rails validates_uniqueness
kan racecondities hebben.
Maak een migratie om de index toe te voegen, of wijzig uw bestaande om deze wijziging weer te geven:
Voor een nieuwe tafel:
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
Voor een bestaande tafel:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Nu kunt u doorgaan en een validatie toevoegen, zoals voorgesteld door anderen, als u uw gebruikers feedback wilt geven dat ze al hebben gestemd:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }