rails postgres example ruby-on-rails json activerecord ruby-on-rails-3

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