2012-01-05 439 views
7

我需要執行驗證以確保公司內只有一個用戶可以存在於給定類別內。ActiveRecord驗證:關聯唯一性

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

這是有效的,除了在:user_id密鑰上設置錯誤消息。

我該怎麼辦,但在:user鍵上設置了錯誤(validates :user給出錯誤)?

+0

'驗證:用戶,:唯一性=> {...}'? – Frost 2012-01-05 09:00:04

+0

可能的重複 - http://stackoverflow.com/questions/8479113/rails-3-1-custom-validation-message-on-join-table-of-has-many-through-relations/8479323#8479323 – maprihoda 2012-01-05 09:00:57

+0

@Martin我在問題中提到它會引發錯誤。建議的副本是完全不同的問題。 – 2012-01-05 11:50:39

回答

7

這裏有一個簡單的方法來檢查唯一性並強制將錯誤分配給: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 

如果你能想出一種在:user_id上使用默認驗證的方法,但是可能你有一個特殊用例,那將是更可取的。

另外,如果你不是一個形式用這個,你可能會考慮分配錯誤:base,因爲你可能會混淆未來開發誰希望出現在:user_id錯誤:

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

是的,迄今爲止的客戶驗證可能是最好的選擇。我無法相信你不能在用戶上應用這個驗證:(驗證user_id的問題是它從來沒有在UI上使用,所以你提到的錯誤信息將不在適當的位置。 – 2012-01-05 15:48:14

-1

我不認爲這是可能的,因爲ActiveRecord的驗證方法發送錯誤的方法被驗證。

因此驗證:用戶將發送到您的模型中不存在的:user的attr_accessor。

不過,如果你只是試圖讓錯誤消息漂亮,您可以:

alias user user_id 

然後使用:用戶在您的驗證。

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

在一個側面說明,我不會別名使用的用戶,而這樣的:

alias the_supplied_user user_id 

然後在您的驗證:

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

好吧,user和user_id確實存在,因爲它是一個關聯。所以別名會破壞一切。 – 2012-01-05 11:55:00