42

Tôi có một mô hình Release với các cột mediumcountry (trong số các cột khác). Không được có releases chia sẻ các kết hợp giống hệt nhau medium/country.Đường ray: xác thực tính duy nhất của hai cột (cùng nhau)

Làm cách nào để viết điều này dưới dạng xác thực đường ray?

+6

Bản sao có thể có của [Đường ray: Xác thực tính duy nhất của nhiều cột] (http://stackoverflow.com/questions/4870961/rails-validate-uniqueness-of-multiple-columns) – Khoga

Trả lời

78

Bạn có thể sử dụng xác thực uniqueness với tùy chọn scope.

Ngoài ra, bạn nên thêm một chỉ số duy nhất cho các DB để ngăn chặn kỷ lục mới từ đi qua kiểm chứng thực khi kiểm tra cùng một lúc trước khi viết:

class AddUniqueIndexToReleases < ActiveRecord::Migration 
    def change 
    add_index :releases, [:country, :medium], unique: true 
    end 
end 



class Release < ActiveRecord::Base 
    validates :country, uniqueness: { scope: :medium } 
end 
+0

+1 cho chỉ mục, nhưng -1 cho chỉ số 'duy nhất' vì nó không được nhận dạng. Đối với phần đó tôi đã sử dụng câu trả lời dưới đây. – Aleks

+2

Có, xin lỗi, khóa xác thực phải là 'duy nhất', không phải là 'duy nhất'. Xem tài liệu được liên kết. Sửa câu trả lời. – tompave

+1

Hm, tốt, cảm ơn :) Để lặp lại bản thân mình - đưa chỉ mục mang đến giải pháp cho cấp độ tiếp theo và không giống như các giải pháp "mã hóa" khác mà tôi đã chạy vào trước khi tìm câu trả lời này. +1 cho điều đó – Aleks

17

Bạn có thể vượt qua một tham số :scope để validator của bạn như thế này:

validates_uniqueness_of :medium, scope: :country 

Xem documentation cho một số ví dụ khác.

+1

Đơn giản, rõ ràng và hoạt động. Cảm ơn! –

+2

@DennisBest Nó "hoạt động", nhưng nó không bảo vệ chống lại điều kiện chủng tộc. Nếu hai máy khách thực hiện các yêu cầu đồng thời, chúng có thể vừa qua xác thực nếu không được cam kết với cơ sở dữ liệu trước khi cơ sở dữ liệu khác được xác nhận hợp lệ. Bạn cũng cần một ràng buộc cơ sở dữ liệu duy nhất như trong câu trả lời của tompave. – soupdog

14

Tất cả các câu trả lời ở trên bị thiếu làm thế nào để xác nhận tính duy nhất của nhiều thuộc tính trong một mô hình. Mã bên dưới dự định cho biết cách sử dụng nhiều thuộc tính trong phạm vi.

validates :country, uniqueness: { scope: [:medium, :another_medium] } 

Nó xác nhận độc đáo của country trong tất cả các hàng với giá trị của mediumanother_medium.

Lưu ý: Đừng quên thêm chỉ mục trên cột trên, điều này đảm bảo việc truy xuất nhanh và thêm xác thực cấp DB cho các bản ghi duy nhất.

Các vấn đề liên quan