当前位置:  开发笔记 > 编程语言 > 正文

如何在rails STI派生模型中禁用验证和回调?

如何解决《如何在railsSTI派生模型中禁用验证和回调?》经验,为你挑选了2个好方法。

给定一个模型

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

什么是最简单,最强大的方法?



1> 小智..:

我喜欢使用以下模式:

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方法来解决这个问题会很好,但是这种模式可以很好地处理复杂的交互.


这个似乎是最正确的.

2> Chandresh Pa..:

作为@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类中禁用验证所需的每个列名创建多个方法.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有