ruby - 使用在父模型中定义的作用域,在它的子模型中(STI 模式)

标签 ruby ruby-on-rails-3 sti

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

相关文章:

ruby-on-rails-3 - Rspec 头痛 : configuration advice appreciated

sql - rails,SQL,单表继承,表地址为 "subclass"而不是类

ruby - 没有抽象类的 Rails STI(单表继承)

ruby-on-rails - 多少类太多了? rails 科学技术

ruby-on-rails - <%= form_tag 和 <% form_tag 之间的区别

ruby-on-rails - PGError : ERROR: source database "template1" is being accessed by other users

ruby catch连接超时错误

ruby - 如何用字符串中的空格替换所有大写字母

ruby-on-rails - Assets 管道中不存在 Assets "application.js"

ruby-on-rails - Activerecord 事务并发竞争条件问题