ruby on rails-如何使用STI的默认作用域



在STI情况下,我在处理default_scope时遇到问题。是否有任何方法可以防止default_scope存在于子类中或覆盖查询条件?

class Parent < ActiveRecord::Base
  default_scope where(:type => ["Child", "OtherChild"])
  scope :flag, where(:flag => true)
end
class Child < Parent
end
class OtherChild < Parent
end

Parent.all=>如果生成正确的结果,则返回所有Child和OtherChild项。它不返回"RemovedChild"类型的对象,该类型在系统中不再有模型。

Child.all=>生成正确的结果,所有子结果。

Child.flag.all=>Broken,而不是所有标志为true的Child,它返回与Parent.flag.all相同的结果,从Parent类添加default_scope,从而替换Child类添加的type=Child。

我必须假设Parent表将包含类型与当前可用类不对应的项,这正是我的默认作用域试图解决的问题。如果有一种方法可以全局捕获并忽略ActiveRecord::SubclassNotFound的任何实例,那么也可以。

要延迟范围解析和解决方法,可以切换到定义类方法而不是范围。

class Parent < ActiveRecord::Base
  default_scope where(:type => ["Child", "OtherChild"])
  def self.flag
    where(:flag => true)
  end
end

相关内容

  • 没有找到相关文章

最新更新