我使用 STI 模式实现类层次结构
class A
scope :aaa, where([someField]:[someValue])
end
class B < A
end
问题是当我尝试调用类似的东西时:
B.limit(5).aaa
=> SELECT "[table]".* FROM "[table]" WHERE "[table]"."type" IN ('A') AND ([someField] = [someValue]) LIMIT 5
所以我得到 5 个类型 A 的对象,它满足范围 :aaa 但是我需要对 type = "B"
的行做同样的事情有没有什么方法可以使用父级的作用域,而无需在 STI 模式的子级中重新定义它?
提前致谢
已编辑
我刚刚和我的 friend 讨论过,他向我展示了一件重要的事情。 A 不是 STI 的根类。事实上整个层次结构看起来像
class O < ActiveRecord::Base
end
class A < O
scope ..... .....
end
class B < A
end
也许是层次结构本身的原因?...
最佳答案
您是正确的,这是多级层次结构的结果。
如果您只有一个继承级别(即如果 A
继承自 ActiveRecord::Base
而不是继承自 O
)。
一旦你有了中间类,Rails 中的 STI 并不总是按预期工作。
我不确定这是否是 Rails 中的错误,或者仅仅是因为无法准确推断应该做什么的结果。我将不得不对此进行更多研究。
您遇到的范围问题只是意外行为的一个例子。另一个例子是查询中间类只会查询它知道的类类型,除非您特别需要它们,否则可能不会包括它的所有子类:
有关更多信息,请参阅以下主题,尤其是底部 MatthewRudy 的帖子:https://groups.google.com/forum/#!topic/hkror/iCg3kxXkxnA
如果您仍想使用范围而不是@Atastor 建议的类方法,您可以将范围放在O
而不是A
。这并不理想,因为范围可能不适用于 O
的每个子类,但它似乎确实会导致 Rails 在 type
列中查询正确的类,并且是一种快速解决方法。
关于ruby - 使用在父模型中定义的作用域,在它的子模型中(STI 模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461806/