2012-07-12 47 views
13

Có ai đưa ra câu trả lời cho các hiệp hội đa hình và dữ liệu ember không?Liên kết đa hình dữ liệu Ember

Chúng tôi cần một số cách để có thể truy vấn loại ở đầu kia của mối quan hệ từ những gì tôi có thể nói.

Bất kỳ ai có suy nghĩ về điều này?

+0

Bạn có thể cho một ví dụ cụ thể về những gì bạn muốn làm gì? – pangratz

+0

Tôi muốn có thể có một cái gì đó như: JSON: {... "attachTo": {"user_id": 16} ...} và theo định nghĩa mô hình: attachedTo: DS.belongsTo ("tự động") –

Trả lời

3

Vì vậy, tôi có điều gì đó. Nó không hoàn thành, hoặc hoàn toàn sạch sẽ, nhưng nó hoạt động. Về cơ bản, tôi sử dụng một mixin để bỏ qua các hiệp hội Ember hoàn toàn. Tôi chắc chắn rằng điều này có thể được cuộn vào bộ chuyển đổi hoặc cửa hàng, nhưng bây giờ công trình này.

mô hình đa hình đi qua JSON với một ItemID và itemtype:

App.Follow = DS.Model.extend 
    user: DS.belongsTo('App.User') 
    itemId: DS.attr("number") 
    itemType: DS.attr("string") 

tôi thêm một mixin với các mô hình có liên quan đến nó:

App.Hashtag = DS.Model.extend App.Polymorphicable, 
    follows:(-> 
    name: DS.attr("string") 
    @polymorphicFilter(App.Follow, "Hashtag") 
).property('changeCount') #changeCount gives us something to bind to 

    followers: (-> 
    @get('follows').map((item)->item.get('user')) 
).property('follows') 

Các mixin thực hiện ba phương pháp, một bản cập nhật changeCount, một phương thức trả về kiểu của mô hình và phương thức polymorphicFilter để lọc mô hình theo itemType và id:

App.Polymorphicable = Ember.Mixin.create 
    changeCount: 1 

    polymorphicFilter: (model, itemType)-> 
    App.store.filter model, 
     (data) => 
     if data.get('itemId') 
      @get('id') is data.get('itemId').toString() and data.get('itemType') is itemType 

    itemType:()-> 
    @constructor.toString().split('.')[1] 

    updatePolymorphicRelationships:()-> 
    @incrementProperty('changeCount') 

Lớp điều khiển được bảo vệ khỏi tất cả jankyness này, trừ trường hợp phải gọi điện updatePolymorphicRelationship để đảm bảo các ràng buộc lửa:

App.HashtagController = Ember.ObjectController.extend 
    follow:()-> 
    App.Follow.createRecord({ 
     user: @get('currentUserController.content') 
     itemId: @get('id') 
     itemType: @get('content').itemType() 
    }) 
    #this provides a way to bind and update. Could be refactored into a didSave() 
    #callback on the polymorphic model. 
    @get('content').updatePolymorphicRelationships() 
    App.store.commit() 

Đó là những gì tôi có cho đến nay. Tôi đang cố gắng để giữ cho mọi thứ trong lớp mô hình vì nó chỉ là một bước gỡ bỏ từ lớp bộ chuyển đổi. Nếu có vẻ như dữ liệu Ember sẽ không xem xét đa hình trong tương lai, thì nó sẽ có ý nghĩa để kéo tất cả lên mức cao hơn, nhưng hiện tại, nó hoạt động và để lại bộ điều khiển (tương đối) sạch sẽ.

8

Với ember-dữ liệu mới nhất xây dựng bây giờ bạn có thể sử dụng các hiệp hội đa hình:

Bạn cần phải cấu hình mô hình của bạn để làm cho nó đa hình:

/* polymorphic hasMany */ 
App.User = DS.Model.extend({ 
messages: DS.hasMany(App.Message, {polymorphic: true}) 
}); 

App.Message = DS.Model.extend({ 
    created_at: DS.attr('date'), 
    user: DS.belongsTo(App.User) 
}); 

App.Post = App.Message.extend({ 
    title: DS.attr('string') 
}); 

/* polymorphic belongsTo */ 
App.Comment = App.Message.extend({ 
    body: DS.attr('string'), 
    message: DS.belongsTo(App.Message, {polymorphic: true}) 
}); 

Bạn cũng cần định cấu hình alias thuộc tính trêncủa mình

DS.RESTAdapter.configure('App.Post' { 
    alias: 'post' 
}); 
DS.RESTAdapter.configure('App.Comment' { 
    alias: 'comment' 
}); 

Kết quả mong đợi từ máy chủ của bạn nên được như thế này:

{ 
    user: { 
     id: 3, 
     // For a polymorphic hasMany 
     messages: [ 
      {id: 1, type: "post"}, 
      {id: 1, type: "comment"} 
     ] 
    }, 

    comment: { 
     id: 1, 
     // For a polymorphic belongsTo 
     message_id: 1, 
     message_type: "post" 
    } 
} 

biết thêm thông tin trong this github thread

+0

Tôi đã gặp sự cố khi một mô hình có nhiều liên kết đa hình - một Bài đăng có thể được nhận xét, có thể đính kèm và thông báo - bạn có gặp sự cố đó trước đây không?Tôi đã từng làm việc xung quanh nó bằng cách có mỗi mô hình "đa hình" của tôi kéo dài từ cuối cùng nhưng điều này có nghĩa là tôi không kiểm soát được các thuộc tính nào xuất hiện trên mỗi mô hình. –

+0

Xảy ra để biết lý do 'hasMany' thay thế một ID với một đối tượng' {id: 1, type: 'type'} ', trong khi một thuộc tính injects này vào đối tượng cha? Nó sẽ sạch hơn nhiều nếu chúng giống nhau, ví dụ: 'comment: {id: 1, message: {id: 1, type: 'post'}}' – Joe

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