Nếu tính toàn vẹn của dữ liệu là rất quan trọng, bạn không nên sử dụng xác thực để đảm bảo tính duy nhất. Nó có thể thất bại. Cách duy nhất để đảm bảo tính duy nhất là sử dụng một ràng buộc cơ sở dữ liệu. Điều này là do Rails validates_uniqueness
có thể có các điều kiện về chủng tộc.
Tạo di chuyển để thêm chỉ mục hoặc thay đổi chỉ mục hiện có của bạn để phản ánh thay đổi này:
Đối với một bảng mới:
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
Đối với một bảng hiện có:
class AddUniqueIndexToVotes < ActiveRecord::Migration
def change
add_index :votes, [voter_id, votefor_id, vote], unique: true
end
end
Bây giờ, bạn có thể tiếp tục và thêm xác thực, theo đề xuất của những người khác, nếu bạn muốn cung cấp cho người dùng phản hồi rằng họ đã bỏ phiếu:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }