2011-08-27 33 views
10

Tôi đang sử dụng permanent_records đá quý trong đường ray của tôi 3.0.10 ứng dụng, để ngăn chặn xóa cứng và có vẻ như đường ray được bỏ qua phạm vi mặc định của tôi trong việc kiểm tra tính độc đáoRails 3 Validate độc ​​đáo bỏ qua phạm vi mặc định trên mô hình

# user.rb 
class User < AR::Base 
    default_scope where(:deleted_at => nil) 

    validates_uniqueness_of :email # done by devise 
end 

trong bảng điều khiển đường ray cố gắng tìm người dùng bằng email đã bị xóa kết quả bằng không, nhưng khi đăng ký tài khoản mới với địa chỉ email đã bị xóa sẽ dẫn đến lỗi xác thực trên trường email.

Đây cũng là trường hợp đối với một mô hình trong ứng dụng của tôi

# group.rb 
class Group < AR::Base 
    default_scope where(:deleted_at => nil) 
    validates_uniqueness_of :class_name 
end 

và đó là trường hợp tương tự như trước đây, xóa một nhóm sau đó cố gắng để tìm thấy nó bằng quả tên lớp trong con số không, tuy nhiên khi tôi cố gắng để tạo một nhóm có tên lớp đã xóa, nó không thành công.

Có ai biết nếu tôi đang làm điều gì sai hay tôi chỉ nên viết trình xác thực tùy chỉnh cho hành vi này?

Trả lời

10

Hãy thử Phạm vi kiểm tra tính độc đáo với deleted_at

validates_uniqueness_of : email, :scope => :deleted_at 

này có thể cho phép hai kỷ lục với giá trị cùng một email miễn là deleted_at lĩnh vực là khác nhau cho cả hai. Miễn là xóa tại là dân cư với dấu thời gian chính xác, mà tôi đoán đá quý permanent_records, điều này sẽ làm việc.

+4

tốt, đừng quên rằng "validates_uniqueness_of" không còn được dùng trong đường ray 3. sử dụng "validates: email,: uniqueness => {: scope =>: deleted_at}" để thay thế. – sandrew

+0

không phải nó vẫn gọi cùng trình xác nhận hợp lệ ...? – Jimmy

+0

Tôi sẽ đánh dấu điều này là đúng vì nó sẽ hoàn toàn ổn, đêm qua thay vì nghĩ những điều qua tôi đã viết trình xác nhận tính độc đáo của riêng tôi đang hoạt động tốt – Jimmy

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