16

私の Rails アプリには、single-table-inheritance を介して親クラスから継承する子クラスがたくさんあります。メイン クラスから継承するすべての子クラスの配列を取得する方法が欲しいです。

別のSO回答で見つけた次のシングルリンクコマンドを試しましたが、親クラスのみが返されます。

ObjectSpace.each_object(class<<MyParentClass;self;end)

これを行うためのきれいな方法はありますか?

編集: どうやら Rails は、Dev モードで呼び出されたときに子クラスのみを遅延ロードし、Rails のバージョンによっては本番環境にある可能性があります。ただし、最初の回答は、Rails 3.1 以降の Prod モードで機能するはずです。

4

7 に答える 7

31

Rails は RubyClasssubclasses()メソッドで拡張します。

Rails 3 では、直接呼び出すことができます。

YourClass.subclasses

Rails 2.3 では、".subclasses" は保護されているため、次のように呼び出す必要がありますsend()

YourClass.send(:subclasses)
于 2012-05-10T14:44:45.730 に答える
15

https://github.com/rails/rails/issues/3364に記載されているように、クラスを熱心にロードする必要があります。

ActionDispatch::Reloader.to_prepare do
  Rails.application.eager_load!
end

その後、次を使用できるようになります。

YourClass.subclasses

また

YourClass.descendants
于 2013-10-04T05:12:01.963 に答える
5
ParentClass.subclasses.map(&:name)
于 2016-07-26T07:15:26.240 に答える
0

上記の Dave G の方法を実装するより効率的な方法であることに注意してください。

Object.select(:type).map(&:type).uniq

これにより、最初にDBから「タイプ」属性のみを持つマーシャリングされたオブジェクトが送信されます。これにより、メモリの消費量が大幅に少なくなり、次に、タイプのみを配列に取り込んで、次にuniqできます。ただし、これを行うための無限に効率的な純粋な SQL の方法があると確信しています。

于 2012-07-21T16:02:43.693 に答える
-8

テーブルに現存する各オブジェクトが少なくとも1つあると仮定します。

Object.all.uniq{|x| x.type}.collect(&:type)
于 2012-05-10T14:04:09.450 に答える