具有与同一模型的多个关系的模型上的createRecord给出了多个可能的反向关系错误

Joe*_*e B 2 ember.js

我已经确定了一些我想看看是否有人可以解释的行为.

我在这里做了一个jsfiddle http://jsfiddle.net/iceking1624/PpWec/17/.要测试行为,请打开Web控制台,只需在"添加问题"按钮旁边的文本字段中键入内容,然后单击按钮("添加问题").

以下是DS.Model架构:

App.Session = DS.Model.extend({
   "questions" : DS.hasMany('App.Question') ,
   "firstQuestion" : DS.belongsTo('App.Question')
});
App.Question = DS.Model.extend({
   "session" : DS.belongsTo('App.Session'),
   "choices" : DS.hasMany('App.Choice'),
   "text"    : DS.attr('string')
});
App.Choice = DS.Model.extend({
   "session"  : DS.belongsTo('App.Session'),
   "question" : DS.belongsTo('App.Question'),
   "text"     : DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)

当我在里面执行以下操作SessionController然后调用该addQuestion函数:

App.SessionController = Ember.ObjectController.extend({
   addQuestion: function() {
      var sessionModel = this.get('model');

      var question = App.Question.createRecord({
         "session" : sessionModel
      });

      this.get('questions').pushObject(question)
   }
});
Run Code Online (Sandbox Code Playgroud)

我得到以下'错误'但它仍然按预期运行:

错误:断言失败:您在App.Question上定义了"会话"关系,但在App.Session上找到了App.Question类型的多个可能的反向关系.

现在我想出来是因为里面App.Session我有两个引用的字段App.Question:

   "questions" : DS.hasMany('App.Question') ,
   "firstQuestion" : DS.belongsTo('App.Question')
Run Code Online (Sandbox Code Playgroud)

但我想知道为什么Ember关心我有多重App.Question关系?特别是为什么它会抛出一个错误,但工作完美.这可能是个错误吗?

有没有办法让Ember快乐而不会抛出错误?我真的需要firstQuestion在我的App.Session模型中使用该字段.

打开控制台,看看我的jsfiddle.这是我的问题的一个完美的例子.然后尝试注释掉firstQuestionApp.Session = DS.Model,看如何错误奇迹般地消失

Joe*_*e B 8

所以我找到了解决方案.我希望这有助于将来的某些人!

显然,将多个关系定义为与我相同的模型是不合适的,而不是更具描述性......

下面我有两个questionsfirstQuestion指向App.Question和Ember不喜欢我是如此模糊!

App.Session = DS.Model.extend({
   "questions" : DS.hasMany('App.Question') ,
   "firstQuestion" : DS.belongsTo('App.Question')
});
Run Code Online (Sandbox Code Playgroud)

为了减少错误传达的机会(并消除恼人的错误),反向关系可以明确定义如下:

App.Session = DS.Model.extend({
    "questions" : DS.hasMany('App.Question', { inverse: 'session' }),
    "firstQuestion" : DS.belongsTo('App.Question')
});
App.Question = DS.Model.extend({
    "session" : DS.belongsTo('App.Session', { inverse: 'questions' }),
    "choices" : DS.hasMany('App.Choice'),
    "text"    : DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)

这摆脱了错误.如果其他人有更多的洞察力甚至批评,我有兴趣听到.