2012-01-02 36 views
6

Tôi đang cố gắng để có được plugin backbone-relational làm việc với sự liên kết giữa các tác vụ và thư. (Một nhiệm vụ có nhiều thông điệp).Backbone-relational: Khóa liên kết sẽ không hoạt động trừ khi nó giống với khóa ngoài

Thông tin được lấy từ một trang web đường ray/activerecord chuẩn, có trường task_id làm khóa ngoại.

Vấn đề là, xương sống-quan hệ sẽ không điền vào trường 'thư' với bất kỳ thư nào trên mô hình Tác vụ trừ khi tôi đặt khóa là "task_id" trong quan hệ ngược lại ... nhưng điều đó có nghĩa là khi truy cập nhiệm vụ từ mô hình Message, trường task_id được điền với đối tượng nhiệm vụ thực tế, không phải là số nguyên 'task_id', được ghi đè. Tôi đoán có một cách đơn giản để chỉ định task_id là khóa ngoài để xác định nhiệm vụ cha mẹ, nhưng có đối tượng mà khóa đại diện được đặt trong một trường khác (ví dụ 'nhiệm vụ' trên đối tượng thư). .. nhưng tôi không thể hiểu được làm thế nào. Bất kỳ ý tưởng đánh giá cao. Mã dưới đây

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

Vui lòng, cách bạn khắc phục sự cố của mình? Tôi đã mở vấn đề sau trên github vì lý do tương tự. cảm ơn. [Chìa khóa nước ngoài cư trú với một vật thể] (https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

Trả lời

3

Bạn có thể sử dụng keySource hoặc keyDestination để giải quyết vấn đề cụ thể của mình.

Ví dụ

Trong ví dụ sau, giả sử chúng ta đang nhận được dữ liệu từ một cơ sở dữ liệu quan hệ cũ-trường, nơi có một mối quan hệ một-nhiều giữa quái vậtLoot_Item. Mối quan hệ này được biểu thị bằng phím số Monster_Id ngoài trong bảng Loot_Item. Chúng ta cũng giả sử rằng dịch vụ REST của chúng ta không làm bất kỳ dữ liệu quần ưa thích nào làm cho chúng ta, vì điều đó dường như phù hợp với tình huống trong câu hỏi của bạn khá chặt chẽ.

keySource

Bây giờ, chúng ta hãy thiết lập "keySource" để khóa ngoại của tôi ("Monster_Id") và "chìa khóa" để tên của thuộc tính mà tôi muốn các dữ liệu thực tế để đi (nói, "Monster").Nếu bạn phá vỡ trong trình gỡ lỗi, bạn sẽ thấy trong đối tượng thuộc tính có, trên thực tế, một trường có tên là "Monster", và nó trỏ đến dữ liệu mô hình quái vật. Này, tuyệt!

includeInJSON

Tuy nhiên, nếu bạn toJSON puppy đó, đoán những gì? Nó đã đặt tất cả dữ liệu quái vật trong Monster_Id, giống như bạn không muốn! GAH! Chúng tôi có thể khắc phục điều đó bằng cách đặt "includeInJSON" thành "Monster_Id". Bây giờ, khi nó được chuyển đổi thành JSON, nó sẽ đưa ID thích hợp trở lại trường Monster_Id, khi nó đang nối tiếp dữ liệu của bạn với JSON, để gửi tới máy chủ.

Sự cố được giải quyết? Er, tốt, trên thực tế, không nhất thiết ...

caveat: Đây tất cả các âm thanh siêu hữu ích, nhưng có một vấn đề khá rõ ràng rằng tôi đã tìm thấy với kịch bản này. Nếu bạn đang sử dụng một công cụ tạo khuôn mẫu (chẳng hạn như một trong Underscore.js) yêu cầu bạn chuyển đổi mô hình của bạn thành JSON, trước khi chuyển nó vào mẫu, rất tiếc - bạn không có quyền truy cập vào dữ liệu quan hệ của mình. Than ôi, JSON mà chúng tôi muốn cho thư của chúng tôi không nhất thiết phải là cùng một JSON mà chúng tôi muốn đưa vào các mẫu của chúng tôi.

+1

Xin vui lòng, làm cách nào bạn khắc phục vấn đề này? Có lẽ tôi đã bỏ lỡ một cái gì đó. Tôi đã mở vấn đề sau trên github. [Chìa khóa nước ngoài cư trú với một vật thể] (https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

+2

Old-school? có thật không? – prauchfuss

+0

Smokefoot, RDBMS đã có từ khoảng đầu những năm 70 (ít nhất). Về thuật ngữ máy tính, đó là "trường học cũ". Tuy nhiên, đó không phải là một đánh giá giá trị về tính hữu ích của chúng. Chúng mạnh mẽ, các trường hợp sử dụng của chúng được hiểu rất rõ, và có rất nhiều công nghệ tương thích với chúng. Thật không may, rất nhiều công nghệ REALLY MỚI đã bị loại bỏ về khả năng tương thích với các cơ sở dữ liệu quan hệ được thiết kế phù hợp, và đó là lý do chúng tôi phụ thuộc vào các tiện ích của bên thứ ba như Backbone-relational, và tại sao nó vẫn chưa giải quyết được vấn đề của chúng tôi. – Tess

0

Nếu bạn muốn "task_id" trong thông điệp JSON là id, không đầy đủ các JSON cho công việc, sau đó thiết lập các "includeInJSON" để được sở hữu ID của Task ("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" 
    } 
    }] 

Giá trị "true" cho includeInJSON nói để sử dụng JSON đầy đủ cho mô hình liên quan.

Chỉnh sửa: Sau khi đọc lại câu hỏi của bạn, tôi không chắc câu trả lời có liên quan đến vấn đề của bạn không.

câu trả lời ban đầu của tôi là cho đăng một thông điệp lại cho máy chủ mà bạn muốn các JSON là một cái gì đó như:

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

Tôi không chắc chắn chính xác những gì bạn đang tìm kiếm để xảy ra, nhưng cách mà Backbone Relational được cho là hoạt động là bộ sưu tập các thông điệp của Task sẽ là một tập hợp các mô hình đầy đủ, vì vậy bạn có thể lặp lại chúng và chuyển chúng sang các khung nhìn để hiển thị, v.v.

Nếu bạn muốn xuất Id của Thư trong mẫu hoặc nội dung nào đó, sau đó bạn sẽ lấy "id" của mẫu Tin nhắn:

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

Xin vui lòng, làm cách nào bạn khắc phục vấn đề này? Có lẽ tôi đã bỏ lỡ một cái gì đó. Tôi đã mở vấn đề sau trên github. [Chìa khóa nước ngoài cư trú với một vật thể] (https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

Các vấn đề liên quan