1

アプリケーションには、次のように定義されたポリモーフィックな関連付けを持つ多くのモデルがあります。

has_many :mentions, :as => :mentionable, :dependent => :destroy

ライブラリ クラスでは、言及可能なすべてのモデルが収集され、後で反復されます。

mentionables = Model1.all + Model2.all + Model3.all ...

これは機能しますが、静的であり、ライブラリ コードには望ましくありません。一番下のステートメントは、機能しない場合でもはるかに直感的です。

mentionables = Mentionable.all

「:as => ...」ディレクティブで定義されたポリモーフィック関係を持つモデルを反復処理する API が Rails にありますか?

4

1 に答える 1

1

ここには 2 つの質問があると思います。両方に答えるために最善を尽くします。まず、Rails アプリケーション内のすべてのモデルを一覧表示する方法が必要です。この質問にはいくつかの方法があり、私はこの回答を好みます( by sj26 )。

# Really depends on how your classes are loaded, usually environment specific.
Rails.application.eager_load!
ActiveRecord::Base.descendants

その後、モデルの関連付けを解析して :as @option が割り当てられているかどうかを判断し、関連付けられているクラス名を引き出す必要があります。これは、関連付けが次のように作成されていることを前提としています。

class Mentionee < ActiveRecord::Base
  has_many :mentions, :as => :mentionable, :dependent => :destroy, :class_name => 'Mentionable'
end

これは、 reflect_on_all_associationsメソッドを使用して行うことができます(これを記述するには、おそらくより Ruby 風の方法があります)。

Mentionee.reflect_on_all_associations.select {|a| a.options[:as] == :mentionable }

Mentionable のポリモーフィック クラス モデルを返します。これらを結合するには、次のようにします (テストされていません!)。

Rails.application.eager_load!

mentionables = []

ActiveRecord::Base.descendants.each do |descendent|
  mentionables << descendent.reflect_on_all_associations.select{|a| a.options[:as] == :mentionable}
end

mentionables.each do |mentionable|
  # Do your work here
end
于 2013-02-13T20:10:21.687 に答える