重写 Rails 单表继承模型中的验证

Dmi*_*sky 3 validation activemodel ruby-on-rails-4

假设我有两个使用 Rails 单表继承的模型。我可以轻松地在子模型中添加验证以使某些字段成为必需的。但是,如果我想要更改验证,使子模型中的字段可选或具有不同的标准(例如数字),该怎么办?

class Parent
  include Mongoid::Document
  field :name, type: String
  field :age, type: Integer
  validates :name, presence: true
  validates :age,   numericality: { greater_than_or_equal_to: 25 }
end
class Child < Parent
  # how can I make name optional in Child?  
  validates :age,   numericality: { less_than: 25 }
end
Run Code Online (Sandbox Code Playgroud)

我可以通过创建自定义验证方法,然后在子类中覆盖它们来完成,但我希望有一种方法可以仅使用默认的 Rails 验证器格式来做到这一点。

小智 5

您应该能够在 Parent 中执行类似的操作

validates :name, presence: true, unless: proc { |c| c.is_a? Child }
Run Code Online (Sandbox Code Playgroud)

不太好,但是如果您只有一个要覆盖的子类,则非常干净。我确信还有其他方法