6

Mam problem z próbą zapisania wielu lub wielu relacji w Ember.js przy użyciu danych ember i szyn. Stowarzyszenie działa dobrze po stronie emberów, jednak kiedy próbuję dokonać transakcji, nie będzie zawierać listy nowych powiązań podczas przesyłania do szyn. Każda pomoc byłaby bardzo cenna, wyrywałem włosy próbując znaleźć przykładową aplikację, która robi coś tak prostego na githubie, ale nie mogę tego znaleźć.Wiele do wielu relacji z Ember, danymi ember i szynami

Oto dumbed dół wersja mojego kodu Ember: forma

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' 

Edit:

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

Szyny Backend (Korzystanie dziedziczone Zasoby i aktywnego modelu klejnoty serializer):

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 

Tak jak powiedziałem, stowarzyszenie działa dobrze na Ember, ale szyny nie wydają się być nowe dane skojarzeń. Kiedy sprawdzę kartę XHR w inspektorze sieciowym, widzę, że wysłano tylko:

Żądaj ładowności {"lista": {"created_at": "Czw, 21 marca 2013 23:16:02 GMT", "team_id": "1"}}

Zostałem zwrócony z błędem 204 brak zawartości, ponieważ nic się nie zmieniło.

Odpowiedz

17

Pomimo faktu, że możliwe jest skonfigurowanie pasujących relacji hasMany, Ember Data nie obsługuje jeszcze wielu do wielu relacji (patrz this issue). Co możesz teraz zrobić, to rozłożyć relację za pomocą modelu członkostwa.

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' 

Teraz można użyć createRecord() i deleteRecord() z modelu członkostwa dodawać i usuwać kontakty.

Niestety, w tym przykładzie nie jest tak łatwo powiązać kolekcję harmonogramów dla konkretnego użytkownika. Jeden obejście jest następujący:

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' 

Jeżeli wiążą się user.rosters, następnie szablon powinien aktualizować, gdy relacje są tworzone lub zniszczone.

+0

bardzo zwięzłe i łatwe do naśladowania odpowiedź, dziękuję za pomoc! – McPants

0

Alternatywne rozwiązanie:

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]') 

do serwera w danych POST będzie wysyłania tablicę identyfikatorów użytkowników