如何在STI中使用默认范围?

时间:2013-02-06 07:59:32

标签: ruby-on-rails ruby-on-rails-3

我在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 =&gt;生成正确的结果,返回所有Child和OtherChild项。它不返回具有“RemovedChild”类型的对象,该类型在系统中不再具有模型。

Child.all =&gt;产生正确的结果,所有Child结果。

Child.flag.all =&gt;破坏,而不是所有Child的with flag = true它返回与Parent.flag.all相同的结果,从Parent类添加default_scope,替换Child类添加的type = Child。

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

1 个答案:

答案 0 :(得分:1)

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

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