Добавление параметра в переменную экземпляра в Rails - PullRequest
1 голос
/ 18 марта 2012

Я создаю переменную экземпляра, которая передается на мой взгляд. С этой переменной 'post' связан user_id, и я хотел добавить дополнительный атрибут с именем 'username', чтобы я мог также передать его и использовать его в представлении.

Вот пример того, что я хотел бы сделать.

@post = Post.find(params[:id])
@post.username = User.find(@post.user_id).username

Столбец имени пользователя существует в моей модели Users, но не в моей модели Songs. Так что это не позволит мне использовать

@post.username

Я знаю, что могу просто создать совершенно новую переменную экземпляра и поместить туда эту информацию, но я бы хотел, чтобы все было красиво и аккуратно, в одной переменной. Который также сделает мой код в формате json более чистым.

Есть идеи, как мне этого добиться?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Исходя из присутствия user_id в вашей Post модели, вы, вероятно, уже настроили ассоциацию, которая может получить имя пользователя.Вероятно, это избавит от многих проблем, если просто использовать существующую связь:

@post = Post.find(params[:id])
username = @post.user.username

Если вы, вероятно, будете запрашивать более одного сообщения за раз (например, на индексной странице, вызывая .includes указание Rails на активную загрузку ассоциации поможет вам избежать проблемы N + 1 :

@posts = Post.includes(:user).all

Наконец, чтобы включить соответствующую запись в вывод JSON, передайте *Параметр 1012 * при сериализации:

# in controller
render :json => @post.to_json(:include => :user)

Этот вопрос включает в себя гораздо более всестороннее обсуждение вариантов сериализации. Стоит прочитать.

2 голосов
/ 18 марта 2012

Нет необходимости передавать отдельную переменную экземпляра. 1. Вы можете использовать @post.user.username для просмотра. 2. Или вы можете создать помощника и передать @post.user

def username user
 user.username
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...