我使用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

也许原因在于层次结构本身?...

最佳答案

您是正确的,这是多级层次结构的结果。

如果您只有一个继承级别(例如,如果AActiveRecord::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/

10-13 04:43