使用在父模型中定义的范围,在其子项内(STI模式)

Ant*_*hov 5 ruby sti ruby-on-rails-3

我使用STI模式实现了一个类层次结构

class A
  scope :aaa, where([someField]:[someValue])
end

class B < A
end
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试调用类似的东西时:

B.limit(5).aaa
=> SELECT "[table]".* FROM "[table]" WHERE "[table]"."type" IN ('A') AND ([someField] = [someValue]) LIMIT 5
Run Code Online (Sandbox Code Playgroud)

所以我得到了5个类型为A的对象,它满足范围:aaa但我需要对type ="B"的行做同样的事情

是否有任何方法可以使用父级的范围,而无需在STI模式的子级中重新划分它?

提前致谢

EDITED

我刚刚和我的朋友讨论过这件事,他向我展示了一件重要的事情.A不是STI的根类.实际上整个层次结构看起来像

class O < ActiveRecord::Base
end

class A < O
  scope ..... .....
end

class B < A
end
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*han 2

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

如果您只有一级继承(即A继承自ActiveRecord::Base而不是继承自O),则作用域将按预期工作。

一旦您学习了中级课程,Rails 中的 STI 并不总是按预期工作。

我不确定这是否是 Rails 中的一个错误,或者只是无法准确推断应该做什么的结果。我得进一步研究一下。

您遇到的范围问题只是意外行为的一个示例。另一个例子是,查询中间类只会查询它所知道的类类型,这可能不包括它的所有子类,除非您特别需要它们:

有关更多信息,请参阅以下主题,尤其是 MatthewRudy 底部的帖子:https://groups.google.com/forum/#! topic/hkror/iCg3kxXkxnA

如果您仍然想按照 @Atastor 的建议使用作用域而不是类方法,则可以将作用域放在 上O而不是A. 这并不理想,因为范围可能不适用于 的每个子类O,但它似乎确实会导致 Rails 查询type列中的正确类,并且是一种快速解决方法。