Rails: включить связанный объект в вывод JSON - PullRequest
26 голосов
/ 03 января 2011

У меня есть класс заметок, принадлежащий пользователю (т. Е. Пользователь может создавать много заметок).

клип из моего контроллера заметок

class NotesController < ApplicationController
  before_filter :authenticate_user!
  respond_to :html, :xml, :json

  # GET /notes
  # GET /notes.xml
  def index
    @notes = Note.includes(:user).order("created_at DESC")
    respond_with @notes
  end

Когда я запрашиваю индекс вjson приводит, например, /notes.json, возвращает ноты, но возвращает только user_id для объекта пользователя.Я хотел бы, чтобы он также включал user.username (и было бы любопытно, как встроить весь пользовательский объект).

Дополнительный вопрос: я не смог найти способ, чтобы столбец отображался как author_id и имелвернуться к пользователю.Если это легко сделать, как ты это делаешь?

Ответы [ 3 ]

42 голосов
/ 03 января 2011

Я не уверен, что новый стиль respond_to / respond_with достаточно гибок, чтобы сделать это. Это может быть очень хорошо, но, насколько я понимаю, это должно упростить только самые простые случаи.

Вы можете добиться того, что вы пытаетесь сделать с respond_to в старом стиле, с помощью блока, передав параметры to_json. Попробуйте что-то вроде этого:

class NotesController < ApplicationController
  def index
    @notes = Note.order("created_at desc")
    respond_to do |format|
      format.json do
        render :json => @notes.to_json(:include => { :user => { :only => :username } })
      end
    end
  end
end
1 голос
/ 17 июля 2015

Вы также можете использовать Jbuilder (https://github.com/rails/jbuilder) для ответа с очень гибкими данными.

@notes = Note.includes(:user).order("created_at DESC")

и в вашем файле index.json.jbuilder вы можете

json.extract! @note
json.username @note.user.username
0 голосов
/ 03 января 2011

Можно ли было бы сделать это наоборот?

def index
  @user = User.includes(:notes).order("created_at DESC")
  respond_with @user
end

Было бы дорого включать пользовательские объекты каждый раз, когда @notes повторяется.

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