Wenn die Datenintegrität kritisch ist, sollten Sie keine Validierung verwenden, um die Eindeutigkeit zu gewährleisten. Es kann scheitern. Die einzige Möglichkeit, Eindeutigkeit zu gewährleisten, ist die Verwendung einer Datenbankeinschränkung. Das liegt daran, dass Rails validates_uniqueness
kann Rennbedingungen haben.
Erstellen Sie eine Migration, um den Index hinzuzufügen, oder ändern Sie Ihre vorhandene, um diese Änderung widerzuspiegeln:
Für eine neue Tabelle:
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
Für eine vorhandene Tabelle:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Jetzt können Sie fortfahren und eine Validierung hinzufügen, wie von anderen vorgeschlagen, wenn Sie Ihren Benutzern Feedback geben möchten, dass sie bereits abgestimmt haben:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }