2012-08-14 40 views
3

我正在尝试使用with_options将管理员用户的条件验证分组在一起。 第二次验证用户名唯一性最终会覆盖with_options条件。是否可以结合with_options和:if for conditional validation?

有没有更好的方法来做到这一点?或者我应该忘记with_options并编写两个单独的语句?

with_options :if => Proc.new { |user| user.admin? } do |admin| 
    admin.validates :email, :presence => true 
    admin.validates :username, :uniqueness => true, :if => Proc.new { |user| user.category == "customized_username" } 
end 

回答

1

如果你只有这两个验证,我不认为这是一个坏主意砸with_options块而直接添加条件,每个验证:

admin.validates :email, :presence => true, :if => Proc.new { |user| user.admin? } 
admin.validates :username, :uniqueness => true, :if => Proc.new { |user| user.admin? && user.category == "customized_username" } 

另一件事你可能想要考虑的是单表继承(STI)而不是使用布尔字段。我会推荐这个,如果你发现自己在你的应用程序中执行user.admin?。使用STI,您将拥有普通用户和管理员用户,并且每个类都可以包含不同的逻辑。你需要提出的是改变你的“管理员”字段“类型”,并使其成为一个字符串的唯一真正的变化:

class User < ActiveRecord::Base 
end 

class AdminUser < User 
    validates :email, :presence => true 
    validates :username, :uniqueness => true, :if => Proc.new { |user| user.category == "customized_username" } 
end 
0

你应该用两条线,但是,它是清洁有方法不是重复Proc中的相同逻辑。

validates :email, :presence => true, :if => :admin? 
validates :username, :uniqueness => true, :if => [:admin?, :custom_user?] 

def custom_user? 
    category == "customized_username" 
end 
相关问题