ruby on rails - postgres - Rieles: incluye el objeto relacionado en la salida JSON
rails postgresql jsonb (3)
Tengo una clase de nota que pertenece a un usuario (es decir, un usuario puede crear muchas notas).
clip de mi controlador de notas
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
Cuando solicito el índice en json results por ejemplo /notes.json, devuelve las notas pero solo devuelve user_id para el objeto de usuario. Me gustaría que también incluya user.username (y sería curioso cómo tener incrustado el objeto de usuario completo).
Pregunta de bonificación: no pude encontrar una manera de hacer que la columna se muestre como author_id y que vuelva a relacionarse con el usuario. Si esto es fácil de hacer, ¿cómo lo haces?
¿Sería posible hacerlo al revés?
def index
@user = User.includes(:notes).order("created_at DESC")
respond_with @user
end
Sería costoso incluir objetos de usuario cada vez que se @notes
las @notes
.
No estoy seguro de que el nuevo estilo respond_to
/ respond_with
sea lo suficientemente flexible para hacer esto. Es muy posible, pero por lo que yo entiendo, está destinado a simplificar solo los casos más simples.
Sin embargo, puede lograr lo que está tratando de hacer con el viejo respond_to
con un bloque pasando parámetros a to_json
. Pruebe algo como esto:
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
También puede usar Jbuilder ( https://github.com/rails/jbuilder ) para responder con datos muy flexibles.
@notes = Note.includes(:user).order("created_at DESC")
y en su archivo index.json.jbuilder, puede
json.extract! @note
json.username @note.user.username