Ember.js RESTful模型关系

时间:2013-10-19 07:57:51

标签: javascript rest ember.js ember-data sails.js

我在Ember.js中有关于从restful服务器检索数据的问题(使用MongoDB由Sails.js提供服务)

我的路由器设置如下:

App.Router.map(function() {
    this.route("dashboard");
    this.resource('exams', {path: "/exams"}, function() {
        this.resource('exam', {path: ":exam_id"}, function(){
            this.resource('questions', function() {
                this.route("new");
            })
        })
        this.route("view", {path: "/:exam_id" }); // for viewing exam details
    });
});

基本上我得到一份可用的考试清单,并且可以编辑每个考试的一些细节,点击它查看相关的问题列表。

我对使用restful adapter访问的Exam资源没有任何问题,如下所示:

http://localhost:1337/api/v1/exams

产生:

{
    exams: [
        {
        user_id: "52444c03268a31ea0b000001",
        title: "Introduction test",
        private: false,
        active: false,
        showResults: false,
        random: false,
        _id: "52471342445565e74600000a"
        },
        ...
    ]
}

问题资源未嵌入并存储在MongoDB中是一个单独的集合,可以单独访问:

http://localhost:1337/api/v1/questions

结果:

{
    questions: [
        {
        _id: "52483f404617e6c728c4ed93",
        title: "What's the capital of Moscow?",
        exam_id: "52471342445565e74600000a"
        },
        {
        _id: "52483f6e4617e6c728c4ed94",
        title: "What's the capital of Switzerland?",
        exam_id: "52471342445565e74600120a"
        }
    ]
}

但是,问题应始终与考试相关。据我所知,你还不能在Ember.js中嵌套休息路线。我理想的休息路线是:

http://localhost:1337/api/v1/exams/52471342445565e74600000a/questions

获取特定考试的所有问题,但我不确定是否可以这样做。至少我从不经理让它发挥作用。

所以为了保持简单,我决定用exam_id仔细查询问题,只得到与特定考试相关的问题列表:

http://localhost:1337/api/v1/questions/52471342445565e74600000a //<-- exam_id

返回我需要的结果......只有Ember.js不允许这样做,因为它认为我得到了一个特定ID的问题。我也尝试过将exam_id推向问题宁静的路线w / URL参数(../?exam_id=52471342445565e74600000a),但似乎queryParams还不是Ember.js的一部分。至少在v 1.2之前没有,正如我在Github上看到的那样。

所以我的问题是:如何通过证明外键来关联和查询这两个模型? 我真的不想把所有东西都嵌入到一件事中。或者也许有更好的方法来管理模型之间的关系?

但有一点需要注意:我需要能够正确地查询服务器以仅检索所需的记录,而不是对整个预取的数据进行排序。这是因为不同的考试属于不同的用户,对其他考试的问题不允许被其他人看到(查询)。

我对Ember.js不熟悉,所以任何建议(或更好的现实世界的例子)都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

如果使用Ember Data,大部分内容非常简单。

查询字符串部分很简单:

this.get('store').find('question', {exam_id: 123213});

会产生类似这样的GET'/ api / questions?exam_id = 123213'

关系部分非常棒且非常容易:

App.BlogPost = DS.Model.extend({
  comments: DS.hasMany("comment")
});

App.Comment = DS.Model.extend({
  post: DS.belongsTo("blogPost")
});