Ако целостта на данните е критична, не трябва да използвате валидиране, за да гарантирате уникалност. Може да се провали. Единственият начин да се гарантира уникалност е да се използва ограничение на база данни. Това е така, защото Rails validates_uniqueness
може да има условия за състезание.
Създайте миграция, за да добавите индекса, или променете съществуващия, за да отразите тази промяна:
За нова таблица:
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
За съществуваща таблица:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Сега можете да продължите и да добавите потвърждение, както е предложено от други, ако искате да дадете обратна връзка на потребителя си, че вече е гласувал:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }