【问题标题】:polymorphic hasMany and belongsTo relationships in ember-data rev 12ember-data rev 12 中的多态 hasMany 和 belongsTo 关系
【发布时间】:2013-04-16 19:42:38
【问题描述】:

我无法使用 ember-data rev12 实现我所理解的多态关系。

我有以下型号:

App.Project = DS.Model.extend
  lists: DS.hasMany('App.List', { polymorphic: true })

App.Proposal = DS.Model.extend
  lists: DS.hasMany('App.List', { polymorphic: true })

App.Employee = DS.Model.extend
  lists: DS.hasMany('App.List', { polymorphic: true })

App.List = DS.Model.extend
  name: DS.attr('string')
  #project: DS.belongsTo('App.Project', { polymorphic: true })

我正在尝试像这样从项目路由器创建一个新列表。

App.ProjectRoute = Ember.Route.extend
  events:
    newList: (project) ->
      lists = project.get('lists')
      list = App.List.createRecord(name: 'list1')
      lists.pushObject(list)
      @store.commit()

但是对服务器的请求却错误地设置了多态键。

我期待有效载荷看起来像:

 { list: { name: list1, listable_type: project, listable_id: 100 } }

但是得到了:

{ list: { name: list1, project_type: project, project_id: 100 } }

我错过了什么?有没有办法定义多态类型或键?


这是我的临时技巧

https://gist.github.com/arenoir/5409904

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    首先,根据您现有的模型,您不需要使用多态关联。而且您可能不想在关系的两端都设置polymorphic 选项。

    如果你想让你的有效载荷包含listable,你只需要重命名你的属性:

    App.List = DS.Model.extend
      name: DS.attr('string')
      listable: DS.belongsTo('App.Project', { polymorphic: true })
    

    更新

    根据我对你的类的理解,它是一个List,可以属于不同的类型。所以你应该像这样定义你的模型:

    App.Listable = DS.Model.extend
      lists: DS.hasMany('App.List')
    
    App.Project = App.Listable.extend
    
    App.Proposal = App.Listable.extend
    
    App.Employee = App.Listable.extend
    
    App.List = DS.Model.extend
      name: DS.attr('string')
      listable: DS.belongsTo('App.Listable', { polymorphic: true })
    

    有效载荷将如下所示:

    {list: {name: "list1", listable_type: 'project', listable_id: 100}}
    

    我不知道您是否还希望将一个列表同时添加到多个列表中。根据您的模型名称,我很容易相信这不是您想要的:一个列表应该包含不同的对象(项目、提案、员工)。而不是一个项目可以有多个列表。

    【讨论】:

    • 好的,我在示例中添加了更多模型。我想唯一的方法是为每个父母创建一个列表模型。唯一的问题是,如果我为每个 eg(App.ProjectList listable: belongsTo 'Project',{poly:y}) 创建一个单独的列表模型,则键是正确的,但 json 根和 url 是错误的。例如(put = "api/project_lists" 有效负载 = {project_list:{listable_type: project, listable_id: 100})。必须有一种方法可以使用 type 和 type_id 多态地设置 hasMany 列表。感谢您的洞察力。
    • 这样可行,但有几个问题。你如何定义多个多态的 hasMany 关系,例如项目和员工都有很多任务。是否可以从可列出和可任务的类扩展?
    • 我的后端(rails)也希望类型为驼峰式。是否可以指定类型? listable_type: 'project' 实际上应该是 listable_type: 'Project'
    • 对于驼峰问题,有一张公开票github.com/emberjs/data/issues/881。我需要为此努力。
    • 一个短期的解决方案是创建一个继承自 Listable 的新模型,并为任务添加 hasMany 关系。我将尝试为该用例提供解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多