给定一个模型
class BaseModel < ActiveRecord::Base validates_presence_of :parent_id before_save :frobnicate_widgets end
和派生模型(底层数据库表有一个type
字段 - 这是简单的rails STI)
class DerivedModel < BaseModel end
DerivedModel
将以良好的OO方式继承所有的行为BaseModel
,包括validates_presence_of :parent_id
.我想关闭验证DerivedModel
,并防止回调方法被触发,最好不要修改或以其他方式破坏BaseModel
什么是最简单,最强大的方法?
我喜欢使用以下模式:
class Parent < ActiveRecord::Base validate_uniqueness_of :column_name, :if => :validate_uniqueness_of_column_name? def validate_uniqueness_of_column_name? true end end class Child < Parent def validate_uniqueness_of_column_name? false end end
如果rails提供了skip_validation方法来解决这个问题会很好,但是这种模式可以很好地处理复杂的交互.
作为@Jacob Rothstein的答案的变体,您可以在父中创建一个方法:
class Parent < ActiveRecord::Base validate_uniqueness_of :column_name, :unless => :child? def child? is_a? Child end end class Child < Parent end
这种方法的好处是您不需要为在Child类中禁用验证所需的每个列名创建多个方法.