我正在尝试使用 with_options 为管理员用户将我的条件验证组合在一起。
用户名唯一性的第二次验证最终会覆盖 with_options 条件。
有一个更好的方法吗?或者我应该忘记 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
最佳答案
如果您只有这两个验证,我认为删除 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) 而不是使用 bool 字段。如果您发现自己在整个应用程序中都使用
user.admin?
,我会推荐这个。使用 STI,您将拥有普通用户和管理员用户,每个用户都可以包含每个类的不同逻辑。您需要进行的唯一真正更改是将“admin”字段更改为“type”并将其设为字符串: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
关于ruby - 是否可以结合 with_options 和 :if for conditional validations?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11956168/