Überschreiben Sie die buildURL-Methode, um die ID des übergeordneten Modells einzuschließen

In Bezug auf Glutdaten und Unterklassen von DS.RESTAdapter zum ÜberschreibenbuildURL.

Ich habe zwei Endpunkte. Sagen wir sie sind:

example.com/users/user-id
example.com/users/user-id/images

Ersetzen Sie "Benutzer-ID" durch die tatsächliche Benutzer-ID.

Ich habe also zwei Modelle:

App.User = DS.Model.extend
    images: DS.hasMany 'image',
        async: true
        inverse: 'user'

App.Image = DS.Model.extend
    user: DS.belongsTo 'user',
        async: true
        inverse: 'images'

Die Nutzlast aus/users/user-id Endpunkte geben die Image-IDs nicht zurück. Ich habe keine Kontrolle darüber (es ist eine Drittanbieter-API).

Daher muss ich eine separate Anfrage an / users / user-id / images stellen. Ich untergeordnete DS.RESTAdapter, um die URL anzugeben:

App.ImageAdapter = DS.RESTAdapter.extend
    buildURL: (type, id) ->
        # need to return "/users/user-id/images"
        # but need to get the value of user-id somehow

Wie würde ich von der Route aus überhaupt vorgehen, um die Benutzer-ID an das Geschäft weiterzugeben, damit es die anrufen kann?buildURL Methode im benutzerdefinierten Adapter mit der Benutzer-ID?

App.UserRoute = Em.Route.extend
    afterModel: (model) ->
        # how to provide value of `model.get 'id'` to store/adapter/buildURL?
        # do I even do that here?
        promise = @get('store').find 'image'
        @controllerFor('images').set 'model', promise

Ich schätze, ich kann einen Hash liefernfind und überspringenbuildURL insgesamt. AberfindQuery ist eine private Methode. Gibt es einen bevorzugten Weg, dies zu tun?

App.UserRoute = Em.Route.extend
    afterModel: (model) ->
        promise = @get('store').find 'image', userId: model.get 'id'
        @controllerFor('images').set 'model', promise

App.ImageAdapter = DS.RESTAdapter.extend
    findQuery: (store, type, query) ->
        imagesURL = "#{@host}/users/#{query.userId}/images"
        delete query.userId
        @ajax(imageURL, 'GET', { data: query });

Antworten auf die Frage(1)

Ihre Antwort auf die Frage