6

Ich habe ein Problem mit dem Versuch, viele zu viele Beziehungen in Ember.js mit Glut-Daten und Schienen zu speichern. Die Assoziation funktioniert auf der Ember-Seite der Dinge gut, wenn ich jedoch versuche, die Transaktion zu begehen, wird sie die Liste der neuen Assoziationen nicht enthalten, wenn sie an Rails gesendet werden. Jede Hilfe würde sehr geschätzt werden, ich habe mir die Haare ausgerissen und versucht, eine Beispielanwendung zu finden, die etwas so einfaches auf GitHub tut, aber ich kann keinen finden.Viele zu viele Beziehungen mit Ember, Glut-Daten und Schienen

ist hier eine verdummte Version meines Ember Code:

App.Store = DS.Store.extend 
    revision: 11 
    adapter: DS.RESTAdapter.create 
    url: '/api' 

App.Router.map -> 
    @resource 'rosters' 
    @resource 'users' 

App.User = DS.Model.extend 
    rosters: DS.hasMany 'App.Roster' 

App.Roster = DS.Model.extend 
    users: DS.hasMany 'App.User' 

App.RostersEditRoute = Ember.Route.extend 
    setupController: (controller, model) -> 
    controller.set 'users_list', App.User.find() 

App.RostersEditView = Ember.View.extend 
    userCheckbox: Em.Checkbox.extend 
    checkedObserver: (-> 
     users = @get 'roster.users' 
     if @get 'checked' 
     users.addObject @get 'user' 
     else 
     users.removeObject @get 'user' 
     @get('controller.store').commit() 
    ).observes 'checked' 

bearbeitet Form:

each user in users_list 
    label.checkbox 
    view view.userCheckbox rosterBinding="current_roster" userBinding="user" | #{user.full_name} 

Rails-Backend (Geerbt Ressourcen und Active Modell Serializer Edelsteine ​​verwenden):

class User < ActiveRecord::Base 
    has_many :rosters_users 
    has_many :rosters, through: :rosters_users 
    accepts_nested_attributes_for :rosters 
end 

class RostersUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :roster 
end 

class Roster < ActiveRecord::Base 
    has_many :rosters_users 
    has_many :users, through: :rosters_users 
    accepts_nested_attributes_for :users 
end 

module Api 
    class RostersController < BaseController 
    end 
end 

module Api 
    class UsersController < BaseController 
    end 
end 

module Api 
    class BaseController < ActionController::Base 
    inherit_resources 

    respond_to :json 
    before_filter :default_json 

    protected 

    # Force JSON 
    def default_json 
     request.format = :json if params[:format].nil? 
    end 
    end 
end 

class UserSerializer < BaseSerializer 
    has_many :rosters, embed: :ids 
end 

class RosterSerializer < BaseSerializer 
    has_many :users, embed: :ids 
end 

Also wie ich schon sagte, der Verein funktioniert gut auf Ember aber Schienen scheint nicht das neue zu bekommen Assoziationsdaten. Wenn ich die XHR Registerkarte im Web-Inspektoren überprüfen, ich sehe es nur diese gesendet:

Anfrage Payload { „Roster“: { „created_at“: „Do, 21. März 2013 23.16.02 GMT“, "team_id": "1"}}

Und ich bin mit einem 204 kein Inhalt Fehler zurückgegeben, weil nichts geändert hat.

Antwort

17

Trotz der Tatsache, dass es möglich ist, übereinstimmende hasMany Beziehungen einzurichten, unterstützt Ember Data tatsächlich noch nicht viele bis viele Beziehungen (siehe this issue). Was Sie vorerst tun können, ist die Zerlegung der Beziehung mithilfe eines Mitgliedschaftsmodells.

App.User = DS.Model.extend 
    rosterMemberships: DS.hasMany 'App.RosterMembership'  

App.RosterMembership = DS.Model.extend 
    user: DS.belongsTo 'App.User' 
    roster: DS.belongsTo 'App.Roster' 

App.Roster = DS.Model.extend 
    rosterMemberships: DS.hasMany 'App.RosterMembership' 

Jetzt können Sie createRecord() und deleteRecord() mit dem Mitgliedschaftsmodell Beziehungen hinzuzufügen und zu löschen verwenden.

Leider ist es in diesem Beispiel nicht so einfach, an die Auflistung von Listen für einen bestimmten Benutzer zu binden. Ein Work-around ist wie folgt:

App.User = DS.Model.extend 
    rosterMemberships: DS.hasMany 'App.RosterMembership' 
    rosters: (-> 
    @get('rosterMemberships').getEach('user') 
).property '[email protected]' 

App.RosterMembership = DS.Model.extend 
    user: DS.belongsTo 'App.User' 
    roster: DS.belongsTo 'App.Roster' 
    relationshipsLoaded: (-> 
    @get('user.isLoaded') and @get('roster.isLoaded') 
).property 'user.isLoaded', 'roster.isLoaded' 

Wenn Sie user.rosters binden, dann sollten Sie Ihre Vorlage aktualisieren, wenn Beziehungen geschaffen oder zerstört werden.

+0

Sehr prägnant und einfach die Antwort zu folgen, Dank für Ihre Hilfe danken! – McPants

0

Alternative Lösung:

App.Roster = DS.Model.extend 
    users_map: DS.attr('array') 
    users: DS.hasMany 'App.User' 

    users_change: (-> 
    @set('users_map', @get('users').map((el) -> el.id).toArray()) 
).observes('[email protected]') 

auf Server in POST Daten sendet Array von Benutzern ids

Verwandte Themen