Jika integritas data sangat penting, Anda tidak boleh menggunakan validasi untuk menjamin keunikan. Itu bisa gagal. Satu-satunya cara untuk menjamin keunikan adalah dengan menggunakan batasan database. Ini karena validates_uniqueness
Rails dapat memiliki kondisi balapan.
Buat migrasi untuk menambahkan indeks, atau ubah yang sudah ada untuk mencerminkan perubahan ini:
Untuk tabel baru:
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
Untuk tabel yang ada:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Sekarang Anda dapat melanjutkan dan menambahkan validasi, seperti yang disarankan oleh orang lain, jika Anda ingin memberikan umpan balik kepada pengguna bahwa mereka telah memilih:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }