2012-07-20 21 views
5

Lassen Sie uns sagen, ich habe eine Rails-Anwendung mit dem folgenden Layout (das ist ein bisschen von meinem aktuellen Projekt vereinfacht):Ember Daten verschachtelte Ressource URL

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

User 
    has many Notes 

Category 
    has many Notes 

Note 
    belongs to User 
    belongs to Category 

Notizen können entweder erteilen

aber nicht:

/notes.json 

Es gibt zu viele Hinweise über das gesamte System in einer Anfrage senden nach unten - der einzig gangbare Weg ist, Senden Sie nur die notwendigen Notizen (d. h. Notizen, die zu dem Benutzer oder der Kategorie gehören, die der Benutzer anzeigen möchte.

Was wäre meine beste Art, dies mit Ember Data zu implementieren?

Antwort

5

würde ich einfach sagen:

Ember Modelle

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'), 
}); 

Rails-Controller

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 

Vorsicht: Diese Controller sind eine vereinfachte Version (Index nach filtern können zu angeforderten IDs, ...). Sie können einen Blick auf How to get parentRecord id with ember data für weitere Diskussion werfen.

Aktiv Modell Serializer

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 

Wir sind Sideload Daten hier, aber man kann es vermeiden, die include Parameter false in ApplicationSerializer Einstellung.


Die Anwender werden Kategorien & Noten von Ember-Daten empfangen & zwischengespeichert werden, wie sie kommen, und fehlende Teile werden bei Bedarf angefordert werden.

+0

Benötigt Ember Data automatisch die Verwendung der entsprechenden URL (/users/:user_id/notes.json oder /categories/:category_id/notes.json), nur basierend auf der Zuordnung? – user1539664

+0

Nein, es wird '/ notes' verwenden, aber Ihr Controller wird eine Join-Traversing-Beziehung sicherstellen, die von (Kategorien | user) ausgeht, so dass das Dataset nur auf nützliche Instanzen beschränkt ist. –

+0

Es gibt also keine Möglichkeit, den Zugriff auf die Notizen von den Objekten Category und User zu ermöglichen. –

Verwandte Themen