【问题标题】:How to retrieve related models in Sails.js loop?如何在 Sails.js 循环中检索相关模型?
【发布时间】:2014-04-22 14:39:12
【问题描述】:

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

目前我正在创建一个应用程序,用户可以在其中创建博客文章并在之后查看它们。检索索引页面上的帖子一切顺利,尽管我在尝试显示作者姓名时遇到了麻烦。

为了实现这一点,我制作了两个模型:帖子和用户。创建 Posts 后,我向 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 循环中访问特定的用户。

【问题讨论】:

  • 这是我转向sails.js 0.10版的原因之一。模型关联非常有用。

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


【解决方案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 中,您有关联。这意味着您可以在模型模式中对关联进行建模。示例:

// 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
    });
});

【讨论】:

  • 您好,感谢您的回复! - 我已经更新到 0.10,虽然我似乎无法弄清楚这些关联是如何工作的。我试过 Post.find().where({ customerID: customerID }).populate('author').exec(function(err, posts){ res.view({ posts: posts, layout: req.session.布局 }); });我第一次发布的东西一切正常,虽然第二个帖子将重定向到我的帖子/新模板..并停止工作。此外,Post 究竟如何知道它属于哪个用户?它在哪里连接?
  • 在不知道您的model 的情况下,很难回答。我建议你先这样做;阅读 Sails 文档中的关联。如果您无法找出为什么它没有按预期工作,请在此处创建另一个问题 SO,我会帮助您:)
  • 这与我通过调用 var params = req.params.all() 获取参数有关。这混合了一些混淆水线/sails-mongo的随机ID。当我用 var params = req.body 替换它时,一切都按预期工作:)。
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2023-04-06
  • 2020-04-10
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多