我使用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 讨论过,他向我展示了一件重要的事情。不是STI的根类。实际上整个层次结构看起来像
class O < ActiveRecord::Base
end
class A < O
scope ..... .....
end
class B < A
end
也许原因在于层次结构本身?...
最佳答案
您是正确的,这是多级层次结构的结果。
如果您只有一个继承级别(例如,如果A
从ActiveRecord::Base
继承而不是从O
继承),则范围将按预期工作。
一旦有了中级类(class),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/