次のフィドルを参照してください: http://www.senchafiddle.com/#xXQlp コンソールを開いて、誤ったデータを示す出力を確認してください。
ここでは、2 つの Student モデルを作成していることがわかります。それぞれのモデルには 0+ Award モデルのリストがあります。Dave は 2 つのかなり良い賞を受賞しました - 当然のことですが :) - 一方、Chaz は 2 つのあまり良くない賞を追加しました。問題は、ロギングが実際にChazが4つの賞を獲得することを示していることです(2つの良い賞と2つの悪い賞)。
このフィドルは、はるかに大きなアプリの深刻な煮詰めですが、私が抱えていた大きな問題の原因としてこれを分離しました - 私はそれに対する「修正」さえ見つけました. フィドルから 55 行目と 56 行目のコメントを外して再度実行すると (必ずローカル ストレージをクリアしてください!)、Chaz が必要な賞を 2 つしか持っていないことがわかります。
理由が明らかであることを願っていますが、これは私が満足している修正ではありません。チャズが4つの賞すべてを獲得する原因となるには、私が協会に対して何か間違ったことをしているに違いありません. ... もちろん?
乾杯!
更新:以下の回答が受け入れられ、autoLoad:true を削除すると問題が解決します。ただし、autoLoad が必要なため、Student モデルの init に次を実装しました。
for (var i=0, l=this.associations.all.length; i<l; i++) {
var assoc = this.associations.all[i];
if (assoc._type == "hasmany") {
var assocName = assoc._name;
var getterName = 'get' + assocName.charAt(0).toUpperCase() + assocName.slice(1);
this[getterName] = function(assocName) {
var self = this;
return function() {
var store = self[assocName]();
if (!store.isLoaded()) {
store.load();
}
return store;
}
}.call(this, assocName)
}
}
これにより、学生が持っている hasMany アソシエーションごとに getter が追加され、そのアソシエーションのストアが返される前に確実にロードされます。つまり、student1.awards() ではなく、student1.getAwards() を使用して、student1 の賞にアクセスできるようになり、賞が読み込まれることがわかります。これは、モデルに追加する他の hasMany アソシエーションに対して自動的に機能します。
これが一部の読者に役立つことを願っています。