0

我有一个像这样的 STI 类层次结构:

Producer, Partner, Freelancer < Statusowner < Contact

当我打电话给例如Partner.all我看到rails产生这个:

SELECT "contacts".* FROM "contacts" WHERE "contacts"."type" IN ('Partner', 'Producer', 'Partner', 'Freelancer') ORDER BY contacts.name

您会看到它首先包括 Partner,然后是 Statusowner 的所有子类,再次包括 Partner。这与所有子类类似。

我已经设置self.descentants了 Statusowner,所以一切都在开发环境的早期加载:

class Statusowner < User
  def self.descendants
    [Producer, Sales, Partner, Freelancer]
  end
end

知道我做错了什么吗?

4

1 回答 1

0

可能您根本不应该重新定义后代方法。也许如果您在定义类之后只需要文件就足够了。

如果您更喜欢一种 hack 来自动加载,也许您可​​以将代码更改为:

class Statusowner < User
  MY_DESCENDANTS = [Producer, Sales, Partner, Freelancer]
end

我相信这可以使您获得相同的结果,但是这样您就不会覆盖原始方法。哦,顺便说一句,子类继承了被覆盖的方法,所以所有这些子类都有方法后代返回[Producer, Sales, Partner, Freelancer]

于 2014-02-04T05:29:04.667 回答