2012-07-20 13 views
5

Digamos que tengo una aplicación Rails con la siguiente distribución (simplificado esto un poco de mi proyecto real):Ember datos URL recurso anidado

User 
    has many Notes 

Category 
    has many Notes 

Note 
    belongs to User 
    belongs to Category 

Notas Puede obtenerse en:

/users/:user_id/notes.json 
/categories/:category_id/notes.json 

pero no:

/notes.json 

Hay demasiadas notas a través de todo el sistema para enviar una solicitud en - el único camino viable es envíe solo las Notas necesarias (es decir Notas que pertenecen al Usuario o Categoría que el usuario está tratando de ver).

¿Cuál sería la mejor manera de implementar esto con Ember Data?

Respuesta

5

diría simple:

modelos

Ember controladores

App.User = DS.Model.extend({ 
    name: DS.attr('string'), 
    notes: DS.hasMany('App.Note') 
}); 

App.Category = DS.Model.extend({ 
    name: DS.attr('string'), 
    notes: DS.hasMany('App.Note') 
}); 

App.Note = DS.Model.extend({ 
    text: DS.attr('string'), 
    user: DS.belongsTo('App.User'), 
    category: DS.belongsTo('App.Category'), 
}); 

Rieles

class UsersController < ApplicationController 
    def index 
    render json: current_user.users.all, status: :ok 
    end 

    def show 
    render json: current_user.users.find(params[:id]), status: :ok 
    end 
end 

class CategoriesController < ApplicationController 
    def index 
    render json: current_user.categories.all, status: :ok 
    end 

    def show 
    render json: current_user.categories.find(params[:id]), status: :ok 
    end 
end 

class NotesController < ApplicationController 
    def index 
    render json: current_user.categories.notes.all, status: :ok 
    # or 
    #render json: current_user.users.notes.all, status: :ok 
    end 

    def show 
    render json: current_user.categories.notes.find(params[:id]), status: :ok 
    # or 
    #render json: current_user.users.notes.find(params[:id]), status: :ok 
    end 
end 

Tenga cuidado: estos controladores son una versión simplificada (índice puede filtrar de acuerdo a los id. solicitados, ...). Puede echar un vistazo a How to get parentRecord id with ember data para mayor discusión.

activos Serializadores Modelo

class ApplicationSerializer < ActiveModel::Serializer 
    embed :ids, include: true 
end 

class UserSerializer < ApplicationSerializer 
    attributes :id, :name 
    has_many :notes 
end 

class CategorySerializer < ApplicationSerializer 
    attributes :id, :name 
    has_many :notes 
end 

class NoteSerializer < ApplicationSerializer 
    attributes :id, :text, :user_id, :category_id 
end 

se incluyen los datos de carga lateral aquí, pero que podría evitarlo, estableciendo el parámetro include-false en ApplicationSerializer.


Los usuarios, categorías & notas serán recibidos & almacenan en caché por brasa de datos como vienen, y se pedirá a los elementos que faltan, según sea necesario.

+0

Will Ember Data solicita automáticamente usar la URL apropiada (/users/:user_id/notes.json o /categories/:category_id/notes.json) solo en función de la asociación? – user1539664

+0

No, usará '/ notes', pero su controlador asegurará la unión, la relación de desplazamiento a partir de (categorías | usuarios), por lo que el conjunto de datos estará limitado a solo instancias útiles. –

+0

¿De modo que no hay forma de permitir el acceso a las notas de los objetos Categoría y Usuario? –

Cuestiones relacionadas