Bạn có thể sử dụng validates
để xác nhận uniqueness
trên một cột:
validates :user_id, uniqueness: {scope: :friend_id}
Cú pháp để xác nhận trên nhiều cột là tương tự, nhưng bạn nên cung cấp một loạt các trường thay thế:
validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}
Tuy nhiên, các phương pháp xác thực được hiển thị ở trên có điều kiện chủng tộc và không thể đảm bảo tính nhất quán. Hãy xem xét ví dụ sau:
bản ghi bảng cơ sở dữ liệu được cho là duy nhất bởi n trường;
nhiều (hai hoặc nhiều) yêu cầu đồng thời, xử lý bởi các quá trình riêng biệt từng (máy chủ ứng dụng, máy chủ nhân nền hoặc bất cứ điều gì bạn đang sử dụng), cơ sở dữ liệu truy cập để chèn cùng một kỷ lục trong bảng;
mỗi quy trình song song xác thực nếu có bản ghi với cùng các trường n;
xác thực cho mỗi yêu cầu được chuyển thành công và mỗi quá trình tạo bản ghi trong bảng có cùng dữ liệu.
Để tránh loại hành vi, ta nên thêm một độc đáo hạn để db bảng.Bạn có thể đặt nó với add_index
helper cho một (hoặc nhiều) lĩnh vực (s) bằng cách chạy di cư sau:
class AddUniqueConstraints < ActiveRecord::Migration
def change
add_index :table_name, [:field1, ... , :fieldn], unique: true
end
end
Caveat: ngay cả sau khi bạn đã thiết lập một hạn chế duy nhất, hai hoặc nhiều yêu cầu đồng thời sẽ cố gắng viết cùng một dữ liệu để db, nhưng thay vì tạo hồ sơ trùng lặp, điều này sẽ nâng cao một ActiveRecord::RecordNotUnique
ngoại lệ, mà bạn nên xử lý riêng biệt:
begin
# writing to database
rescue ActiveRecord::RecordNotUnique => e
# handling the case when record already exists
end
tha thứ cho tôi nếu tôi bị dày đặc, nhưng điều đó sẽ giúp ích gì trong tình huống này? – re5et
thử sử dụng "validates_uniqueness_of" trong mô hình của bạn. nếu điều này không hoạt động, hãy thử tạo một chỉ mục mà bạn có thể tạo ra một sự di trú của các feild, bao gồm một câu lệnh như add_index: table, [: column_a,: column_b],: unique => true) –
@HarryJoy, anh ta hỏi ' Có một cách đường ray'. Và bạn cung cấp cho anh ta cách không rails, nhưng tiêu chuẩn. 'Cách hoạt động ghi lại rằng trí thông minh thuộc về các mô hình của bạn, không phải trong cơ sở dữ liệu.' – Green