【发布时间】:2013-02-06 07:59:31
【问题描述】:
我在处理 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 结果。
Child.flag.all => Broken,而不是所有带有 flag = true 的 Child,它返回与 Parent.flag.all 相同的结果,添加来自 Parent 类的 default_scope 替换了 Child 类添加的 type = Child .
我必须假设 Parent 表将包含类型与当前可用类不对应的项目,这是我的默认范围试图解决的问题。如果有一种方法可以全局捕获并忽略 ActiveRecord::SubclassNotFound 的任何实例,那也可以。
【问题讨论】:
-
try: scope :flag -> {where(flag:true)},我相信通过不使用 lambda,您不会在正确的时间解析范围(即当您调用它时)什么时候定义它)
-
不走运,我切换到范围 :flag, lambda { where(:flag => true) } 并得到了相同的结果。
标签: ruby-on-rails ruby-on-rails-3