2013-07-17 30 views
3

Ember tutorial,介紹了許多一對多的關係爲:我可以在Ember.js的一側建立多對多的關係嗎?

App.Post = DS.Model.extend({ 
    tags: DS.hasMany('App.Tag') 
}); 

App.Tag = DS.Model.extend({ 
    posts: DS.hasMany('App.Post') 
}); 

是否有可能只是把這些DS.hasMany關係1。比如(讓我知道如果我的代碼是不正確以任何方式):

App.Post = DS.Model.extend({ 
    postid: DS.attr('number'), 
    content: DS.attr('string'), 
    tags: DS.hasMany('App.Tag') 
}); 

App.Tag = DS.Model.extend({ 
    tagid: DS.attr('number'), 
    name: DS.attr('string') 
}); 

所以,可以有一個JSON像這些燈具適配器設置:

App.Tag.FIXTURES = [{ 
    tagid: 1111, 
    name: 'Ember.js', 
}, { 
    tagid: 2222, 
    name: 'Javascript' 
}]; 

App.Post.FIXTURES = [{ 
    postid: 3000, 
    content: 'A JS Question' 
    tags: [2222] 
}, { 
    postid: 4000, 
    content: 'An Ember.js Question', 
    tags: [1111, 2222] 
}]; 

所以基本上很多-TO-許多關係只在父母中建立,這就是爲什麼我沒有在App.Tag模型中包含posts: DS.hsaMany('App.Post')

我做得好嗎?如果是這樣,那麼在兩種模式下我應該什麼時候需要DS.hasMany? 如果不是,請更正Fixture JSON。

如果適配器的類型有差別,也請您解釋一下怎麼不同(相關question)。


更新:由於intuitivepixel跟我解釋說,關係必須是多到很多,讓我再試試吧:

App.Post = DS.Model.extend({ 
    postid: DS.attr('number'), 
    content: DS.attr('string'), 
    tags: DS.hasMany('App.Tag') 
}); 

App.Tag = DS.Model.extend({ 
    tagid: DS.attr('number'), 
    name: DS.attr('string'), 
    posts: DS.hasMany('App.Post') 
}); 

燈具適配器設置可能是這樣的,我們的關係是隻在帖子中定義?

App.Tag.FIXTURES = [{ 
    tagid: 1111, 
    name: 'Ember.js', 
}, { 
    tagid: 2222, 
    name: 'Javascript' 
}]; 

App.Post.FIXTURES = [{ 
    postid: 3000, 
    content: 'A JS Question' 
    tags: [2222] 
}, { 
    postid: 4000, 
    content: 'An Ember.js Question', 
    tags: [1111, 2222] 
}]; 

或者它是否必須是這樣的,其中關係是在兩者中定義的。如果是這樣,那麼這些信息是不是多餘的?冗餘是可怕的,但。 :(

App.Tag.FIXTURES = [{ 
    tagid: 1111, 
    name: 'Ember.js', 
    posts: [4000] 
}, { 
    tagid: 2222, 
    name: 'Javascript', 
    posts: [3000, 4000] 
}]; 

App.Post.FIXTURES = [{ 
    postid: 3000, 
    content: 'A JS Question' 
    tags: [2222] 
}, { 
    postid: 4000, 
    content: 'An Ember.js Question', 
    tags: [1111, 2222] 
}]; 
+0

你的第二個賽事是正確的。至於冗餘,這是多對多關係的本質 – intuitivepixel

+0

我已經包含了一個顯示多對多工作的小jsbin,看看我的更新答案。 – intuitivepixel

+0

我有同樣的問題。您可以獲得冗餘信息,寫入串行器或擴展燈具適配器。我選擇編寫一個序列化程序來爲我處理冗餘。這可能是你最好的選擇。 – GJK

回答

2

是否有可能只是把這些DS.hasMany關係1。

是的,但這將是一個接着一個一對多的關係。

所以基本上這個多對多的關係剛剛在父母身上建立起來,這就是爲什麼我沒有在App.Tag模型中包含帖子:DS.hasMany('App.Post')。

你正在嘗試做是不行的,你需要再一個一對多的關係,你的模型應該是這樣的:

App.Post = DS.Model.extend({ 
    postid: DS.attr('number'), 
    content: DS.attr('string'), 
    tags: DS.hasMany('App.Tag') 
}); 

App.Tag = DS.Model.extend({ 
    tagid: DS.attr('number'), 
    name: DS.attr('string') 
    post: DS.belongsTo('App.Post') 
}); 

和記者在興業則:

App.Tag.FIXTURES = [{ 
    tagid: 1111, 
    name: 'Ember.js', 
    post: 4000 
}, { 
    tagid: 2222, 
    name: 'Javascript', 
    post: 4000 
}]; 

App.Post.FIXTURES = [{ 
    postid: 4000, 
    content: 'An Ember.js Question', 
    tags: [1111, 2222] 
}]; 

我在做什麼好嗎?如果是這樣,那麼我應該在兩種模型中何時需要DS.hasMany?

這不是真的沒關係,恕我直言(因爲的tag的性質),應該可以指定一個tag許多職位,許多標籤可以被分配到一個post。所以我們最終使用了一個多對多的關係,就像你在上面提到的ember教程中那樣,我猜這是有原因的。

因此,您的問題的最終答案:我可以建立一個多對多的關係,只是一方面在燼 - js會 - 不!

更新

我已經把togheter一個小例子,如何多到多的關係會工作,see here

希望它有幫助。

+0

你答案的裝置並不反映這個事實,tagid 2222也在postid 3000中。因此,一個帖子可以有多個標籤,一個標籤可以在多個帖子中,這**使它們成爲多對多多少關係,對吧? –

+0

@霍啓利 – intuitivepixel

+0

@霍啓力我的回答只顯示了做一對多關係的方式,但多對一的方式會更正 – intuitivepixel

0

你可以使用RESTAdapter來完成。這樣,您就可以在帖子旁邊加載標籤。但正如直觀的像素正確指出的那樣,這並不是真正的多對多關係。

App = Ember.Application.create(); 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Post.find(); 
    } 
}); 

App.Adapter = DS.RESTAdapter.extend(); 

App.Adapter.map('App.Post', { 
    tags: { embedded: 'load' } 
}); 

App.Store = DS.Store.extend({ 
    adapter: App.Adapter.create({ 
    namespace: 'api' 
    }) 
}); 

App.Post = DS.Model.extend({ 
    content: DS.attr('string'), 
    tags: DS.hasMany('App.Tag') 
}); 

App.Tag = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

和你的JSON有效載荷將是:

{ 
    "posts": [ 
    { 
     "id": 4000, 
     "content": "An Ember.js Question", 
     "tags": [ 
     { 
      "id": 1, 
      "name": "ember.js" 
     }, 
     { 
      "id": 2, 
      "name": "javascript" 
     }, 
     { 
      "id": 3, 
      "name": "ember-data" 
     } 
     ] 
    } 
    ] 
} 
相關問題