2011-01-03 22 views
26

Tengo una clase de nota que pertenece a un usuario (es decir, un usuario puede crear muchas notas).Rieles: incluir el objeto relacionado en la salida JSON

pinza 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 pido el índice de resultados JSON por ejemplo /notes.json, devuelve las notas, pero sólo 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 he podido encontrar la forma de mostrar la columna como author_id y relacionarla con el usuario. Si esto es fácil de hacer, ¿cómo lo haces?

Respuesta

39

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.

Puede lograr lo que está tratando de hacer con el viejo modelo respond_to con un bloque, sin embargo, pasando los parámetros al to_json. Intentar 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 
+1

¡Perfecto! Eso me llevó a donde tenía que ir. Pude volver a agregar en el soporte de html después de hacer funcionar la parte json como lo mostró. – Codezy

+0

@Jimmy Cuadra: Trabajé muy útil para mí. Gracias un montón. – Besi

-1

¿Sería posible hacerlo al revés?

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

que sería caro para incluir objetos de usuario cada vez que se repite el @notes.

+0

estoy tratando de conseguir todas las notas que incluyen el nombre de usuario que lo creó. Esto solo devolvería a todos los usuarios, no resolvería mi problema. – Codezy

1

También puede utilizar Jbuilder (https://github.com/rails/jbuilder) a la respuesta 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