我有一个STI类层次结构,如下所示:
Producer, Partner, Freelancer < Statusowner < Contact
当我打电话给例如Partner.all
时,我看到铁轨产生了以下内容:
SELECT "contacts".* FROM "contacts" WHERE "contacts"."type" IN ('Partner', 'Producer', 'Partner', 'Freelancer') ORDER BY contacts.name
您可以看到它首先包括Partner,然后是Statusowner的所有子类,再次包括Partner。所有子类都会发生类似的情况。
我已经在Statusowner中设置了self.descentants
,因此所有内容都会在开发环境的早期加载:
class Statusowner < User
def self.descendants
[Producer, Sales, Partner, Freelancer]
end
end
知道我做错了什么吗?
您可能根本不应该重新定义子体方法。也许在定义类之后只需要文件就足够了。
如果你更喜欢一种破解方式来自动加载,也许你可以把你的代码改为:
class Statusowner < User
MY_DESCENDANTS = [Producer, Sales, Partner, Freelancer]
end
我相信这可以让你获得同样的结果,但这样你就不会覆盖原来的方法。哦,顺便说一下,子类继承了overroden方法,所以所有这些子类都有返回[Producer, Sales, Partner, Freelancer]
的方法子类。