【问题标题】:Many to Many Relationships with Ember, ember-data and Rails与 Ember、ember-data 和 Rails 的多对多关系
【发布时间】:2013-03-15 11:43:12
【问题描述】:

我在尝试使用 ember-data 和 rails 在 Ember.js 中保存多对多关系时遇到问题。该关联在 ember 方面运行良好,但是当我尝试提交事务时,它不会在提交到 rails 时包含新关联列表。任何帮助都将不胜感激,我一直在努力寻找一个示例应用程序,该示例应用程序在 github 上执行如此简单的操作,但我似乎找不到。

这是我的 Ember 代码的简化版本:

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}

Rails 后端(使用继承的资源和活动模型序列化器 gem):

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 上运行良好,但 rails 似乎没有获取新的关联数据。当我在网络检查器中查看 XHR 选项卡时,我看到它只发送了这个:

请求负载 {"roster":{"created_at":"2013 年 3 月 21 日星期四 23:16:02 GMT","team_id":"1"}}

我返回 204 no content 错误,因为没有任何改变。

【问题讨论】:

    标签: ember.js many-to-many has-many-through ember-data ember-rails


    【解决方案1】:

    替代解决方案:

    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('users.@each')
    

    在 POST 数据中向服务器发送用户 ID 数组

    【讨论】:

      【解决方案2】:

      尽管可以设置匹配的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 'rosterMemberships.@each.relationshipsLoaded'
      
      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,那么您的模板应该会在创建或销毁关系时更新。

      【讨论】:

      • 非常简洁易懂的回复,感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多