2

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

我的路由器设置如下:

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 适配器访问的考试资源没有任何问题,如下所示:

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 的问题。我还尝试考虑使用 URL 参数(../?exam_id=52471342445565e74600000a)推送exam_id 来质疑restful 路由,但似乎queryParams 还不是Ember.js 的一部分。正如我在 Github 上看到的,至少在 v 1.2 之前没有。

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

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

我对 Ember.js 有点陌生,所以任何建议(或更好但现实世界的例子)都会受到赞赏。

4

1 回答 1

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")
});
于 2013-10-19T18:41:23.433 回答