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