2011-08-25 24 views
13

Tôi đang sử dụng backbone.jsbackbone.js - xử lý các mối quan hệ mô hình theo một cách RESTful

Ví dụ, giả sử chúng ta có một "sản phẩm" mô hình và mô hình "loại" trong đó có một nhiều-to- nhiều mối quan hệ. Trong một quan điểm của tôi, nói rằng tôi cần truy xuất danh sách tất cả các danh mục và biết liệu mỗi danh mục có liên quan đến mô hình sản phẩm hiện tại hay không.

Tôi có thiết lập bộ sưu tập "danh mục" và nó có phải là thuộc tính của mô hình hay không và bằng cách nào đó cho phép truy cập vào id của mô hình để nó được tìm nạp, nó chỉ nhận các danh mục có liên quan? Và sau đó tôi có thể lấy tất cả các loại và qua kiểm tra chúng để xem những cái nào có liên quan trong khi vẫn có những cái không?

Tôi không biết cách tốt nhất để làm điều này là gì. Tôi đã quen với việc sử dụng ORM giúp dễ dàng ở phía máy chủ.

Trả lời

13

Khám phá backbone-relational.

+1

Tôi ditto xương sống-quan hệ. Đó là một sự xấu hổ nó không phải là một phần của sự phát triển xương sống chính. –

0

Giả sử bạn đang sử dụng một bảng tham gia vào backend:

Tạo một bộ sưu tập và mô hình có chứa tất cả các hàng trên cùng bảng của bạn và thêm các phương pháp sau để bộ sưu tập: productsByCategorycategoriesByProduct (sử dụng [tham gia bộ sưu tập] .where (...).)

Có dữ liệu trong Backbone phản chiếu dữ liệu của bạn trong phần phụ trợ dường như giúp giữ mọi thứ đơn giản và bạn sẽ không phải làm bất cứ điều gì phức tạp khi thiết lập URL.

5

Có một giải pháp tùy chỉnh & đơn giản cho nó, mặc dù nó có thể không mạnh mẽ như backbone-relational.

Backbone.ModelWithRelationship = Backbone.Model.extend({ 
    mappings: {}, 

    set: function(attributes, options) { 
    _.each(this.mappings, function(constructor, key) { 
     var RelationshipClass = stringToFunction(constructor); 
      var model = new RelationshipClass(); 

     /* New relational model */ 
      if (!this.attributes[key]) { 
     this.attributes[key] = (model instanceof Backbone.Collection) ? model : null; 
      } 

      /* Update relational model */ 
      if (attributes[key] && !(attributes[key] instanceof Backbone.Model || attributes[key] instanceof Backbone.Collection)) { 
     if (model instanceof Backbone.Model) { 
      this.attributes[key] = model; 
      this.attributes[key].set(attributes[key], options);   
     } else if (model instanceof Backbone.Collection) { 
      this.attributes[key].reset(attributes[key], options);   
     } 

     delete attributes[key]; 
      } 
    }, this); 

    return Backbone.Model.prototype.set.call(this, attributes, options); 
    } 
}); 

Bạn có thể khai báo ánh xạ chỉ bằng cách tạo phân lớp Backbone.ModelWithRelationship.

Models.Post = Backbone.ModelWithRelationship.extend({ 
    mappings: { 
    'comments': 'Collection.CommentCollection', 
    'user': 'Models.User' 
    } 
}); 
1

http://pathable.github.com/supermodel/ thật tuyệt vời. Nó cho phép bạn làm những việc như:

Post.has().many('comments', { 
    collection: Comments, 
    inverse: 'post' 
}); 

Comment.has().one('post', { 
    model: Post, 
    inverse: 'comments' 
}); 

var post = Post.create({ 
    id: 1, 
    comments: [{id: 2}, {id: 3}, {id: 4}] 
}); 

post.comments().length; // 3 
var comment = Comment.create({id: 5, post_id: 1}); 
post.comments().length; // 4 
comment.post() === post; // true :D 
+0

Tôi đang tìm siêu mẫu đơn giản hơn nhiều và quan trọng hơn quan hệ xương sống. Nó có một thiết kế thông minh mà giữ cho mỗi cửa hàng của một mô hình trong bộ sưu tập của riêng mình như là một điểm trung tâm của lưu trữ mà vẫn tươi. –

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