ポリモーフィック関連しているクラスに対して共通のメソッドを投げて返してもらう処理を書きたかったのですが、妙に泥臭くなった上にGoogleでもひっかからなかったのでブログで共有します。もっとマシな方法募集中。
環境
Rails 3.1.1 ruby 1.9.2 p290
Railsプロジェクト内のモデルクラスを取得する
ActiveRecord::Baseを継承しているクラスから絞り込む方法もありますが、ロードされていないクラスを取得することができない弱点があってよろしくありません。ここは一つテーブル名からクラスを取得する方法でアプローチしようと思います。
以下のコードで取得できます。
def model_classes ActiveRecord::Base.connection.tables.map do |table| Object.const_get(table.classify) rescue nil end.compact end
ポリモーフィック関連しているクラスを絞り込む
ポリモーフィック関連は以下のように定義するので、以下のような定義のあるクラスを持ってくるコードを書きます。
ポリモーフィック関連コード例
has_one :part, :as => :instanceable
絞り込む
def polymorphic_classes(relationship, polymorphic) model_classes.select do |model| model.reflections[relationship] && model.reflections[relationship].options[:as] == polymorphic end end # 使用例 polymorphic_classes(:part, :instanceable) # => [Content(id: integer, ...)]
ちょっと力技なのでよりよい方法を知っている方がいれば教えて下さい!