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)
也许原因在于层次结构本身?...
您是对的,这是多级层次结构的结果。
如果您只有一级继承(即A继承自ActiveRecord::Base而不是继承自O),则作用域将按预期工作。
一旦您学习了中级课程,Rails 中的 STI 并不总是按预期工作。
我不确定这是否是 Rails 中的一个错误,或者只是无法准确推断应该做什么的结果。我得进一步研究一下。
您遇到的范围问题只是意外行为的一个示例。另一个例子是,查询中间类只会查询它所知道的类类型,这可能不包括它的所有子类,除非您特别需要它们:
有关更多信息,请参阅以下主题,尤其是 MatthewRudy 底部的帖子:https://groups.google.com/forum/#! topic/hkror/iCg3kxXkxnA
如果您仍然想按照 @Atastor 的建议使用作用域而不是类方法,则可以将作用域放在 上O而不是A. 这并不理想,因为范围可能不适用于 的每个子类O,但它似乎确实会导致 Rails 查询type列中的正确类,并且是一种快速解决方法。
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |