我正在尝试使用 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/

10-13 04:15