1. ホーム
  2. ruby-on-rails

[解決済み】Railsアプリのすべてのモデルのコレクションを取得する方法はありますか?

2022-04-08 05:18:17

質問

RailsアプリのすべてのModelのコレクションを取得する方法はありますか?

基本的に、以下のようなことは可能でしょうか。-

Models.each do |model|
  puts model.class.name
end

解決方法は?

編集部:コメントや他の回答を見てください。これより賢い答えがあるはずです。あるいは、コミュニティWikiとしてこれを改善することを試みてください。

モデルはマスターオブジェクトに自分自身を登録しないので、Railsはモデルのリストを持っていません。

でも、アプリケーションのmodelsディレクトリの中身を見ることはできるはず...。

Dir.foreach("#{RAILS_ROOT}/app/models") do |model_path|
  # ...
end

EDIT: もう一つの(野生の)アイデアは、Ruby Reflectionを使って、ActiveRecord::Baseを拡張するすべてのクラスを検索することです。しかし、すべてのクラスをリストアップする方法を知りません....

EDIT: 面白半分に、全クラスをリストアップする方法を見つけました。

Module.constants.select { |c| (eval c).is_a? Class }

EDIT: やっとディレクトリを見ずに全モデルをリストアップすることに成功した

Module.constants.select do |constant_name|
  constant = eval constant_name
  if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
    constant
  end
end

派生クラスも扱いたい場合は、スーパークラス・チェーン全体をテストする必要があります。私は、Classクラスにメソッドを追加することでそれを行いました。

class Class
  def extend?(klass)
    not superclass.nil? and ( superclass == klass or superclass.extend? klass )
  end
end

def models 
  Module.constants.select do |constant_name|
    constant = eval constant_name
    if not constant.nil? and constant.is_a? Class and constant.extend? ActiveRecord::Base
    constant
    end
  end
end