我需要執行驗證以確保公司內只有一個用戶可以存在於給定類別內。ActiveRecord驗證:關聯唯一性
validates :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"}
這是有效的,除了在:user_id
密鑰上設置錯誤消息。
我該怎麼辦,但在:user
鍵上設置了錯誤(validates :user
給出錯誤)?
我需要執行驗證以確保公司內只有一個用戶可以存在於給定類別內。ActiveRecord驗證:關聯唯一性
validates :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"}
這是有效的,除了在:user_id
密鑰上設置錯誤消息。
我該怎麼辦,但在:user
鍵上設置了錯誤(validates :user
給出錯誤)?
這裏有一個簡單的方法來檢查唯一性並強制將錯誤分配給: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'
是的,迄今爲止的客戶驗證可能是最好的選擇。我無法相信你不能在用戶上應用這個驗證:(驗證user_id的問題是它從來沒有在UI上使用,所以你提到的錯誤信息將不在適當的位置。 – 2012-01-05 15:48:14
我不認爲這是可能的,因爲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"}
好吧,user和user_id確實存在,因爲它是一個關聯。所以別名會破壞一切。 – 2012-01-05 11:55:00
'驗證:用戶,:唯一性=> {...}'? – Frost 2012-01-05 09:00:04
可能的重複 - 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
@Martin我在問題中提到它會引發錯誤。建議的副本是完全不同的問題。 – 2012-01-05 11:50:39