Как преобразовать имя таблицы ActiveRecord в имя класса модели - PullRequest
15 голосов
/ 26 мая 2011

Есть ли возможность правильно преобразовать имя таблицы ActiveRecord в имя класса модели? Я нашел один взломать

def model_for_table(table_name)
  table_name.classify.constantize
end

но поскольку мы используем set_table_name для многих наших моделей, это не сработает. Есть ли способ сделать это?

Ответы [ 3 ]

9 голосов
/ 27 мая 2011

Я сделал это!

Это возвращает хэш в виде "table_name" => "model_class_name".

Hash[ObjectSpace.enum_for(:each_object, class << ActiveRecord::Base; 
    self; end).to_a.reject{|c| c == ActiveRecord::Base}.collect{
    |c| [c.table_name, c.name]}]

РЕДАКТИРОВАТЬ: Лучшая версия (работает только с Rails 3):

Hash[ActiveRecord::Base.send(:descendants).collect{|c| [c.table_name, c.name]}]

Обратите внимание, что не все ваши классы моделей всегда загружены.Чтобы загрузить их все перед созданием такого хэша, сделайте следующее:

Dir.foreach("#{RAILS_ROOT}/app/models") { |f| require f if f =~ /.*\.rb/ }

Nice.

2 голосов
/ 26 мая 2011
ObjectSpace.each_object(Class).select{ |klass| 
  klass < ActiveRecord::Base 
}.index_by(&:table_name)

Это не самая быстрая вещь в мире, хотя

1 голос
/ 07 августа 2011

Можно сделать так в рельсах 3:

ActiveRecord::Base.descendants.collect{|c| [c.table_name, c.name]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...