0

次のような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 が含まれ、次に Partner を含む Statusowner のすべてのサブクラスが含まれていることがわかります。これは、すべてのサブクラスで同様に発生します。

self.descentantsStatusownerを設定したので、すべてが開発環境の早い段階で読み込まれます。

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

私が間違っていることは何ですか?

4

1 に答える 1

0

おそらく、子孫メソッドを再定義するべきではありません。クラスを定義した後にファイルを必要とするだけで十分でしょう。

オートロードの一種のハックを好む場合は、コードを次のように変更できます。

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

これで同じ結果が得られると思いますが、この方法では元のメソッドをオーバーライドしません。ところで、サブクラスはオーバーライドされたメソッドを継承しているため、これらすべてのサブクラスにはメソッドの子孫が返され[Producer, Sales, Partner, Freelancer]ます。

于 2014-02-04T05:29:04.667 に答える