rest - How do I make an Ember-Data has-many collection that is defined by another API endpoint? -
i've got model, post
has many comment
s. response get /posts/12
pretty ember-data-friendly:
{ "post": { "id": 12, "title": "i love ramen", "created_at": "2011-08-19t14:22", "updated_at": "2011-08-19t14:22", "body": "..." } }
the api post
's comment
s, however, get /posts/12/comments
, returns
{ "comments": [ { "id": 673, "author_id": 48, "created_at": "2011-08-21t18:03", "body": "me too!" } ] }
what can model or adapter tell post 12
's comment
s, use /posts/12/comments
? notice post
has no knowledge of comment
ids.
update
in response buuda's answer, here clarifications:
the post
must able comment
s can (a) show comments on postroute
, (b) have properties on post
like
hascomments: function() { return this.get('comments.length') > 0; }.property('comments')
it's fine me if have implement comments
computed property, though. in above-mentioned answer, buuda suggests
app.comments.find({ id: postid });
how datastore fetch /posts/:postid/comments
instead of /comments?postid=:postid
?
you don't need setup relationship between models, necessarily. nested resources allow fetch appropriate data. router:
app.router.map(function() { this.resource('posts', { path: '/posts/:post_id' }, function() { this.route('edit'); this.resource('comments', function() { this.route('new'); }); }); });
the commentsroute can model resource contained in , fetch comments post id:
app.commentsroute = ember.route.extend({ model: function() { var post = this.modelfor('posts'); var postid = post.get('id'); return app.comments.find({ id: postid }); } });
the posts model doesn't need know comment ids, underlying datastore has return appropriate comments based on post id queries. returned array used model comments route.
edit:
i assume using ember-data. if so, nested resource urls (posts/:postid/comments) not yet supported. show comments in post route might want fetch comments data, set on comments controller, use controller injection ('needs') in posts controller, , use experimental 'control' handlebars tag show comments view:
app.postsroute = ember.route.extend({ setupcontrollers: function() { var post = this.modelfor('posts'); var postid = post.get('id'); var comments = app.comments.find({ id: postid }); this.controllerfor('comments').set('content', comments); } });
i explain how use experimental control tag here: how render hasmany associations own controller
Comments
Post a Comment