2012-01-02 59 views
6

我試圖讓backbone-relational插件與任務和消息之間的關聯一起工作。 (任務有很多消息)。骨幹關係:關聯鍵將無法工作,除非它與外鍵相同

信息從標準rails/activerecord站點中提取,該站點有一個task_id字段作爲外鍵。

問題是,骨幹關係不會在任務模型中填充任何消息的'消息'字段,除非我將該關鍵字設置爲「task_id」的反向關係......但這意味着,在訪問來自消息模型的任務,task_id字段填充了實際的任務對象,而不是被覆蓋的'task_id'整數。

我在猜測有一個簡單的方法來指定task_id作爲確定父任務的外鍵,但有鑰匙表示放置在不同字段(例如消息對象上的'任務')的對象。 ..但我無法弄清楚如何。任何想法讚賞。下面

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel 
    paramRoot: 'task' 

    relations: [{ 
    type: Backbone.HasMany, 
    key: "messages", 
    relatedModel: "Backbonescaffolddemo.Models.Message", 
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection", 
    includeInJSON: true 
    reverseRelation: { 
     key: "task_id" 
     includeInJSON: true 
    } 
    }] 
+0

請問,您是如何解決您的問題的?由於相同的原因,我在github上打開了以下問題。謝謝。 [用對象填充的外鍵](https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs 2012-07-05 13:10:16

回答

3

您可以使用keySourcekeyDestination來解決您的特定問題。

在以下示例中,假設我們正在從一個老派的關係數據庫,其中有怪物Loot_Item之間的一對多的關係獲取數據。這種關係通過Loot_Item表中的Monster_Id外鍵表示。讓我們還假設我們的REST服務不會爲我們嵌套任何花式數據,因爲這似乎與您的問題的情況非常接近。

keySource

現在,讓我們設置設置「keySource」我的外鍵(「Monster_Id」)和「鑰匙」屬性的名稱,我想實際數據去(比如,「怪物」 )。如果你在調試器中斷,你會在屬性對象中看到實際上有一個名爲「Monster」的字段,它確實指向了怪物模型數據。嘿,很酷!

includeInJSON

但是,如果你給JSON那隻小狗,猜怎麼着?它將所有怪物數據放在Monster_Id中,就像你不想要的一樣! GAH!我們可以通過將「includeInJSON」設置爲「Monster_Id」來解決這個問題。現在,當它轉換爲JSON時,它將正確的ID放回到Monster_Id字段中,當它將數據序列化爲JSON時,發送到服務器。

問題解決了嗎?呃,嗯,其實,並不一定...

CAVEAT:這聽起來超有用,但有我有這種情況下發現一個相當突出的問題。如果您使用的模板引擎(如Underscore.js中的模板引擎)需要您將模型轉換爲JSON,然後再將其傳遞到模板中,那麼您就無法訪問關係數據。唉,我們想爲我們的消息所需的JSON不一定是我們想要提供給我們模板的JSON。

+1

請問,你是如何解決這個問題的?也許我錯過了什麼。我在github上打開了以下問題。 [用對象填充的外鍵](https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs 2012-07-05 13:14:13

+2

老派?真? – prauchfuss 2012-10-08 11:53:28

+0

Smokefoot,RDBMSes自70年代初至今(至少)已經存在。在計算方面,這很「老派」。但是,這不是一個關於它們的用處的價值判斷。它們非常強大,它們的用例很好理解,並且有大量的技術與它們兼容。不幸的是,很多真正的新技術一直不贊同與正確設計的關係數據庫的兼容性,這就是爲什麼我們依賴於Backbone-relational等第三方附加組件,以及爲什麼它仍然不能很好地解決我們的問題。 – Tess 2012-10-20 07:56:36

0

如果你想在消息JSON在「TASK_ID」是ID,而不是完整的JSON的任務代碼,然後設置「includeInJSON」是任務的ID屬性(「TASK_ID」)

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel 
    paramRoot: 'task' 

    relations: [{ 
    type: Backbone.HasMany, 
    key: "messages", 
    relatedModel: "Backbonescaffolddemo.Models.Message", 
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection", 
    includeInJSON: true 
    reverseRelation: { 
     key: "task_id" 
     includeInJSON: "task_id" 
    } 
    }] 

includeInJSON的「true」值表示爲相關模型使用完整的JSON。

編輯:重新閱讀您的問題後,我不確定我的回答與您的問題有關。

我原來的答覆是發佈消息回到你想要的JSON是像服務器:

{ 
    "message_title": "My Title", 
    "message_body": "Blah blah blah...", 
    "task_id": 12345 
} 

我不知道你希望發生什麼,但方式該骨幹關係應該工作的是,該任務的消息收集將是一個完整模型的集合,所以你可以迭代它們並將它們傳遞給視圖以進行渲染等。

如果要輸出該消息的ID在模板或其他內容中,那麼您需要消息模型的「ID」:

myTask.get('messages').first().id -> returns the first message's id 
+1

請問,你是如何解決這個問題的?也許我錯過了什麼。我在github上打開了以下問題。 [用對象填充的外鍵](https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs 2012-07-05 13:15:25