Подтвердить что ты не робот

Rails: включить связанный объект в выход JSON

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

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

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 и связать его с пользователем. Если это легко сделать, как вы это делаете?

4b9b3361

Ответ 1

Я не уверен, что новый стиль 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

Ответ 2

Вы также можете использовать 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

Ответ 3

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

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

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