Jeśli integralność danych ma kluczowe znaczenie, nie należy używać walidacji w celu zagwarantowania niepowtarzalności. Może się nie udać. Jedynym sposobem zagwarantowania unikalności jest użycie ograniczenia bazy danych. Dzieje się tak, ponieważ Rails validates_uniqueness
mogą mieć warunki wyścigowe.
Utwórz migrację, aby dodać indeks, lub zmień istniejący, aby odzwierciedlić tę zmianę:
Dla nowej tabeli:
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
Dla istniejącej tabeli:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Teraz możesz przejść dalej i dodać potwierdzenie, zgodnie z sugestią innych, jeśli chcesz przekazać swoim użytkownikom opinię, że już zagłosowali:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }