gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:54 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com