如何在Sails.js循环中检索相关模型?

时间:2014-04-22 14:39:13

标签: mongodb model sails.js waterline nested-queries

我对Sails.js(和节点)场景很陌生。

目前我正在创建一个应用程序,用户可以在其中创建博客帖子并在以后查看它们。这一切都很好地检索索引页面上的帖子,虽然我在试图显示作者姓名时遇到了麻烦。

为实现这一目标,我制作了两个模型:帖子和用户。创建帖子后,我会向Post模型添加一个'postedBy'属性,其中包含帖子所属的用户的ID。

现在,在我的索引视图中(我正在显示帖子)我正在做这样的事情:

<% _.each(posts, function(post) { %>
    <a href="/post/show/<%= post.id %>">
        <div class="post" data-id="<%= post.id %>" data-model="post">
            <div class="row panel-body">
                <div class="col-xs-7">
                    <h3><%= post.title %></h3>
                    <span class="date">By <%= post.postedBy %> <span class="date-nicely"><%= post.createdAt %></span></span>
                </div>
                <div class="col-xs-4">
                    <!-- Other markup -->
                </div>
            </div>
        </div>
    </a>
<% }); %>

这里的一切都能正常运作。虽然我想通过使用'postedBy'属性搜索来访问用户的数据,但我可以显示他们的名字和其他东西。我不想将海报的名称直接存储到Post模型中,因为用户名可能会发生变化,并且应该直接链接到用户名。

'index': function(req, res, next) {
    var customerID = req.session.User.customerID;

    Post.find()
        .where({ customerID: customerID })
        .limit(5)
        .sort('createdAt DESC')
        .done( function foundPosts(err, posts) {
            if ( err ) {
              return next(err);
            }
            res.view({
              posts: posts,
              layout: req.session.layout
            });
        }
    );
},

在我的控制器中,我试图遍历从MongoDB获得的帖子(使用Post.find()。limit(5).sort('createdAt DESC')。done(function(err,posts){ }); - 像这样的东西)。我已经阅读了Sail.js / waterline文档中的Promised,虽然我无法让它工作,以便我可以访问每个Post循环中的特定用户。

1 个答案:

答案 0 :(得分:1)

要实现这一目标,您有两种选择:

使用Sails.js版本0.9

您必须嵌套查询。看一下这个例子:

.done()函数中:

.done(function foundPosts(err, posts) {

    posts.forEach(function(post){
        User.find().where({ owner: post.ownerID }).done(function (err, user) {
            // create new property on the post object
            post.user = user.ownerName;
        });
    });

    res.view({
      posts: posts,
      layout: req.session.layout
    });
}

使用Sails.js版本0.10

在(当前)最新版本的sails.js中,您有 association 。这意味着您可以在模型架构中建模关联。例如:

// From the file: myApp/api/models/posts.js

module.exports = {

    attributes: {
        title:'STRING',
        body:'STRING',
        author:{
            model: 'user' // Here you associate the user model
        }
    }

}

这意味着,在您的查询中,您可以执行以下操作:

Post.find().where({ customerID: customerID }).populate('user').exec(function(err, posts){
    res.view({
      posts: posts,
      layout: req.session.layout
    });
});