2012-01-05 37 views
7

Tôi cần thực hiện xác thực để đảm bảo rằng chỉ một người dùng trong công ty có thể tồn tại trong một danh mục nhất định.ActiveRecord xác nhận: tính duy nhất trên liên kết

validates :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Tác phẩm này ngoại trừ thông báo lỗi được đặt trên :user_id.

Làm cách nào tôi có thể thực hiện tương tự nhưng đặt lỗi trên khóa :user (validates :user có lỗi)?

+0

'xác nhận: người dùng,: uniqueness => {...} '? – Frost

+0

có thể trùng lặp - http://stackoverflow.com/questions/8479113/rails-3-1-custom-validation-message-on-join-table-of-has-many-through-relations/8479323#8479323 – maprihoda

+0

@Martin Tôi đã đề cập trong câu hỏi rằng nó làm tăng lỗi. Bản sao được đề xuất là một câu hỏi hoàn toàn khác. –

Trả lời

7

Đây là một cách đơn giản để kiểm tra tính duy nhất và buộc lỗi được gán cho thuộc tính :user:

class User < ActiveRecord::Base 
    validate :user_unique_per_company_per_category 

    private 

    def user_unique_per_company_per_category 
    if self.class.exists?(:user_id => user_id, :company_id => company_id, :category => category) 
     errors.add :user, 'already exists' 
    end 
    end 
end 

Nó sẽ là thích hợp hơn, tôi nghĩ rằng, nếu bạn có thể tìm ra một cách để sử dụng xác nhận mặc định trên :user_id, nhưng có thể bạn có một trường hợp sử dụng đặc biệt.

Ngoài ra, nếu bạn không sử dụng điều này trong một biểu mẫu, bạn có thể xem xét gán lỗi để :base, vì bạn có thể nhầm lẫn các nhà phát triển trong tương lai người mong đợi các lỗi xuất hiện trên :user_id:

errors.add :base, 'already exists' 
+0

Vâng, xác nhận quyền sở hữu cho đến nay có lẽ là lựa chọn tốt nhất. Tôi không thể tin rằng bạn không thể áp dụng xác thực này cho người dùng: (Vấn đề với việc xác thực user_id là nó không bao giờ được sử dụng trên giao diện người dùng, vì vậy thông báo lỗi như bạn đã đề cập sẽ không ở đúng nơi. –

-1

Tôi không nghĩ rằng điều này là có thể vì phương thức xác thực của ActiveRecord gửi lỗi đến phương thức được xác thực.

Vì vậy, xác thực: người dùng trys để gửi attr_accessor của: người dùng không tồn tại trong mô hình của bạn.

Mặc dù, nếu bạn chỉ cần cố gắng để làm cho các thông báo lỗi khá bạn có thể:

alias user user_id 

Và sau đó sử dụng: dùng trong xác nhận của bạn.

validates :user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Trên một mặt lưu ý, tôi sẽ không sử dụng người dùng trong bí danh chứ không phải cái gì đó như:

alias the_supplied_user user_id 

Và sau đó trong xác nhận của bạn:

validates :the_supplied_user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 
+1

Vâng, cả người dùng và user_id đều tồn tại vì đó là một liên kết. Vì vậy, răng cưa sẽ chỉ phá vỡ mọi thứ. –

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