WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Railsでアプリ内の全モデルクラスを取得する

   

ORMにActiveRecordを使っている場合

資料を作る時に必要になったので標題のようなことをやりたい。
下記のような手順で取得してあとはエディタ(Vim)とか表計算ソフト(エクセル)で調整することにした。

tables = ActiveRecord::Base.connection.tables                               # ActiveRecordがマッピングしているテーブルを取得
models = tables.map{ |table| Object.const_get(table.classify) rescue nil }  # テーブル名からモデルクラスを取得(※ActiveRecordの命名規則にしたがっていないモデルはnilになる)
tables_models = Hash[*tables.zip(models).flatten]                           # テーブル名がキーで値がモデルクラスのハッシュを生成
tables_models.each{|key, value| puts "#{key}:#{value}" }
# ... コピペして加工など任意の処理

おまけ: モデルのアソシエーション情報を取得する

モデルのアソシエーションを動的に取得は下記のような感じでできる。

これはユーザモデルのすべてのアソシエーションをアソシエーションの形態(has_manyなど)や外部キーなどの情報をリストアップする場合。

User.reflections.each{|key, value| puts "#{key},#{value.macro},#{value.quoted_table_name}.#{value.association_foreign_key}" }
company,belongs_to,`companies`.company_id
...

このvalueはActiveRecord::Reflection::AssociationReflectionのインスタンスになっていて、ここにアソシエーションに関する情報が保持されている。
`User.reflect_on_all_associations(:has_many)`みたいにアソシエーションタイプで絞ることも可能。
アソシエーションがうまく動作しないときはここにどんな値が入っているか確認するといいかも。

Class: ActiveRecord::Reflection::AssociationReflection — Documentation for rails (3.0.0)

 - Ruby on Rails , , , ,