データの整合性が重要な場合は、一意性を保証するために検証を使用しないでください。失敗する可能性があります。一意性を保証する唯一の方法は、データベース制約を使用することです。これは、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] }