14

Tôi có một mô hình có hai trường, mà tôi sẽ gọi first_name và last_name, và tôi muốn đảm bảo rằng sự kết hợp của hai cột không phân biệt chữ hoa chữ thường. Tôi đã nhận được nửa đường bằng cách sử dụng này:Rails validates_uniqueness_of trên nhiều cột có phân biệt chữ hoa chữ thường

validates_uniqueness_of :first_name, :scope => :last_name 

Vấn đề là việc kiểm tra tính độc đáo có vẻ là trường hợp nhạy cảm, mặc dù the documentation nói nó phải được phân biệt dạng chữ theo mặc định. Vì vậy, cho một hồ sơ hiện có:

{ :first_name => 'John', :last_name => 'Smith' } 

này sẽ được phép:

{ :first_name => 'JOHN', :last_name => 'SMITH' } 

Cũng như bất cứ hồ sơ thêm nơi có bất kỳ biến thể của trường hợp một trong hai cái tên đầu tiên hoặc cuối cùng. Tại sao những hồ sơ này được cho phép? Làm cách nào để tôi có thể thực thi tính độc đáo phân biệt chữ hoa chữ thường trên cả hai trường với nhau?

Trả lời

21

Bạn đã thử validates_uniqueness_of :first_name, :scope => :last_name, :case_sensitive => false chưa?

documentation says theo mặc định.

(Tôi nghĩ liên kết bạn đã cung cấp là một số tài liệu lỗi thời. IIRC, mặc định cho điều này đã thay đổi trong vài năm qua.)

+0

Bạn nói đúng! Tôi đã bị lừa bởi tài liệu tôi tìm thấy. Đặt ': case_sensitive => false' làm cho nó hoạt động cho first_name, nhưng nó không hoạt động theo hướng khác. Nó vẫn sẽ chấp nhận '{: first_name => 'John',: last_name => 'SMITH'}'. Có cách nào để làm cho nó hoạt động hai chiều? Tôi có chỉ đưa vào hai quy tắc 'validates_uniqueness_of' với trường được hoán đổi không? –

+0

Tôi đã thử thêm xác thực khác với hai trường được hoán đổi. Nó bây giờ sẽ bắt các trường hợp mà một trong các trường khác nhau, nhưng không phải nếu cả hai đều có, vì vậy điều này vẫn được thông qua: '{: first_name => 'JOHN',: last_name => 'SMITH'}'. –

+1

Tôi chỉ viết phương pháp xác thực tùy chỉnh vào thời điểm này nếu tôi là bạn. –