2015-06-01 6 views
0

У меня есть метод моделивызова метода модели с другой точки зрения

def full_name_find(user_id) 
    user = User.find(user_id) 
    "#{user.first_name} #{user.last_name}" 
end 

, который находится в User модели. Я хотел бы назвать это из другого представления (билеты # show), и я не могу заставить его работать.

Я пробовал:

<%= User.full_name_find(comment.user_id) %> 

где комментарий имеет user_id. Я получаю undefined method 'full_name_find' for #<Class:0x007fd188e41108>. Я только могу заставить его работать, когда я придерживаюсь метод full_name_find в помощнике приложений и вызвать в виду, как:

<%= full_name_find(comment.user_id) %> 

и она работает. Любой совет?

ответ

3

Вы могли бы заставить его работать, делая это метод класса, то есть, поставив self. перед его именем:

def self.full_name_find(user_id) 
    user = find(user_id) 
    "#{user.first_name} #{user.last_name}" 
end 

User.full_name_find(123) 
# => "Jane Doe" 

... но это довольно странно. Не имеет смысла делать операцию с базой данных (User.find) в методе, который должен только вернуть имя пользователя. Гораздо более идиоматических подход был бы простой метод экземпляра, который позволит вам получить полное имя для любого экземпляра пользователя:

class User < ActiveRecord::Base 
    # ... 
    def full_name 
    "#{first_name} #{last_name}" 
    end 
end 

Тогда, на ваш взгляд:

<%= comment.user.full_name %> 

Это намного лучше по причине выше (не говоря уже о том, что намного проще), но также потому, что когда вы загружаете свои комментарии, вы можете использовать includes, чтобы загружать связанных пользователей (например, Comment.where(...).includes(:user)), поэтому вам не нужно делать целую кучу дополнительные запросы к базе данных для получения имен пользователей.

+0

Да, но я стараюсь избегать писать его на каждом взгляде, для которого я буду использовать «полное имя». Куда я буду писать эти методы. –

+0

Избегайте писать что? 'Comment.user.full_name'? –

Смежные вопросы