Получить класс модели из символа - PullRequest
11 голосов
/ 15 марта 2011

Я реализую метод, который будет использоваться во многих местах проекта.

def do association

end

«Ассоциация» - это символ, такой как :articles, :tags, :users и т. Д..

Когда ассоциация :articles, мне нужно работать с моделью Article.

Когда ассоциация :users, мне нужно работать с моделью User.

И т. Д.

Я знаю, что могу написать вспомогательный метод, который возвращает класс модели в зависимости от предоставленного символа.Но есть ли готовый метод для этого?

Ответы [ 2 ]

27 голосов
/ 15 марта 2011

Rails предоставляет метод с именем classify для класса String для этой цели.

:users.to_s.classify.constantize
#User

:line_items.to_s.classify.constantize
#LineItem

Редактировать:

Если вы пытаетесь получитьДля класса, связанного с ассоциацией, используйте этот подход:

Author.reflect_on_association(:books).klass
# => Book

Это будет касаться сценария, в котором имя ассоциации не соответствует имени класса.

Например:

class Order
  has_many :line_items
  has_many :active_line_items, :class_name => "LineItem", 
             :conditions => {:deleted => false}
end

В приведенном выше примере :active_line_items приведет к ActiveLineItem, и наш оригинальный код выдаст ошибку.

Подробнее об этом здесь .

1 голос
/ 15 марта 2011

Это будет работать

(:users.to_s.singularize.capitalize.constantize).find :all, :conditions => ["name = ?", "john"]

И с вашим примером

association.to_s.singularize.capitalize.constantize
...