6

ember-data 및 레일을 사용하여 Ember.js에서 다 대 다 관계를 저장하는 데 문제가 있습니다. 협회는 사물의 엠버 사이드에서 잘 작동하지만, 거래를 저지하려고 할 때 레일에 제출할 때 새로운 협회 목록을 포함하지 않을 것입니다. 어떤 도움이라도 대단히 감사 할 것입니다. 저는 제 머리를 찢어서 github에서 간단한 것을하는 예제 응용 프로그램을 찾으려고했지만, 찾을 수없는 것 같습니다.Ember, ember-data 및 Rails와의 다 대다 관계

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' 

편집 양식 :

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

레일 백엔드 (상속 자원 및 Active 모델 시리얼 보석 사용) :

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 
을 여기

내 엠버 코드의 아래 무식 버전입니다

내가 말했듯이, 협회는 Ember에서 잘 작동하지만 레일은 새로운 것을 얻지 않는 것 같습니다. 연관 데이터. 웹 검사기에서 XHR 탭을 확인하면 다음과 같이 보냈습니다.

페이로드 요청 { "created_at": "Thu, 21 Mar 2013 23:16:02 GMT", "team_id": "1"}}

아무것도 변경되지 않았으므로 204 내용 없음 오류가 표시됩니다.

답변

17

일치하는 hasMany 관계를 설정할 수 있다는 사실에도 불구하고 Ember Data는 실제로 많은 관계를 아직 지원하지 않습니다 (this issue 참조). 지금 할 수있는 것은 회원 모델을 사용하여 관계를 분해하는 것입니다.

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' 

지금 당신은 관계를 추가 및 삭제하고, 회원 모델 createRecord()deleteRecord()를 사용할 수 있습니다.

이 예에서 특정 사용자의 로스터 컬렉션에 바인딩하는 것은 쉽지 않습니다.

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' 

당신이 user.rosters에 결합하는 경우, 관계가 생성되거나 파괴 될 때 다음 템플릿을 업데이트해야합니다 다음과 같이 하나의 해결 방법입니다.

+0

응답을 따를 매우 간결하고 쉽게, 당신의 도움을 주셔서 감사 사용자 ID의 배열을 보내는 것입니다! – McPants

0

대체 솔루션 : POST 데이터의

서버에
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]')