2013-10-04 36 views
0

我將Ember版本1.0.0與Ember Data v1.0.0-beta.3結合使用。問題在於,當爲關係添加一些附加屬性時,似乎無法獲得對模型的有效引用。我會舉一個例子來說明我想完成什麼,因爲我覺得很難解釋。EmberJS數據 - 引用id並添加其他屬性

首先,我的模型是有線這樣:

App.Employee = DS.Model.extend({ 
    firstName: DS.attr("string"), 
    lastName: DS.attr("string"), 
    languages: DS.hasMany("language", { async: true }) 
}); 

App.Language = DS.Model.extend({ 
    name: DS.attr("string"), 
    employee: DS.belongsTo("employee") 
}); 

目前,我使用的燈具,但後來我打算使用RESTAdapter。這是我的JSON看起來像:

App.Employee.FIXTURES = [ 
    { 
    id: 1, 
    firstName: "Alpha", 
    lastName: "Dog", 
    languages: [1, 2] 
    }, 

    { 
    id: 2, 
    firstName: "Bravo", 
    lastName: "Cat", 
    languages: [3] 
    } 
]; 

App.Language.FIXTURES = [ 
    { 
    id: 1, 
    name: "German" 
    }, 
    { 
    id: 2, 
    name: "Spanish" 
    }, 
    { 
    id: 3, 
    name: "Russian" 
    } 
]; 

現在這個工作,但我想要做的是添加額外的信息,在員工模型中的語言鍵。像這樣,以替換語言特性:

languages: [ 
    { 
    id: 1, 
    knowledge: 3 
    }, 
    { 
    id: 2, 
    knowledge: 2 
    } 
] 

我添加一個額外的知識領域有關的語言,以及指定的ID必須是指在語言模型的ID。運行這個會給我一個TypeError(不能調用未定義的'toString'方法)。

那麼,我該如何建模/修復此問題?我可以使用多態關係或序列化程序來完成這項工作,因爲我遇到了這些術語?我已經找了很久了,這個(新的)框架讓我越來越困惑。

回答

0

它看起來像你需要一個映射表(模型)之間的員工和語言,你可以存儲知識。像這樣:

App.Employee = DS.Model.extend({ 
    firstName: DS.attr("string"), 
    lastName: DS.attr("string"), 
    languageSkills: DS.hasMany("languageSkill", { async: true }) 
}); 

App.LanguageSkill = DS.Model.extend({ 
    employee: DS.belongsTo("employee"), 
    language: DS.belongsTo("language"), 
    knowledge: : DS.attr('number'), 
}); 

App.Language = DS.Model.extend({ 
    name: DS.attr("string"), 
    languageSkills: DS.hasMany("languageSkill") 
}); 
+0

這是我的備份計劃,所以我想沒有比這個解決方案更「高級」了嗎? 無論如何,感謝您的回覆,但只是要完成,不應該App.Language'hasMany'LanguageSkill? – Sander

+0

你說得對,我修復了代碼。關於「更先進」的解決方案:問題在於關係沒有設計的特性。每當你偶然發現這個需求時,映射表就是答案。特別是當您需要在關係數據庫上建模數據時。 –

相關問題