Как получить связанные модели в цикле Sails.js?

Я новичок в Sails.js (и node).

В настоящее время я создаю приложение, в котором пользователи могут создавать сообщения в блогах и просматривать их впоследствии. Все прошло хорошо при получении сообщений на странице индекса, хотя у меня возникают проблемы, когда я пытаюсь показать имя автора.

Для этого я сделал две модели: сообщения и пользователи. Когда сообщение создается, я добавляю атрибут postedBy в модель сообщения, содержащий идентификатор пользователя, которому принадлежит сообщение.

Теперь в моем индексном представлении (где я показываю сообщения) я делаю что-то вроде этого:

<% _.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){}); - Что-то вроде этого). Я читал о Promised в документации Sail.js/waterline, хотя я почему-то не могу заставить его работать, чтобы я мог получить доступ к конкретному пользователю в каждом цикле Post.


person Lars Dol    schedule 22.04.2014    source источник
comment
Это одна из причин, по которой я перешел на версию Sails.js 0.10. Ассоциации моделей очень полезны.   -  person InternalFX    schedule 22.04.2014


Ответы (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

В последней (на данный момент) версии паруса.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
    });
});
person aludvigsen    schedule 23.04.2014
comment
Привет, спасибо за ответ! - Я обновился до 0.10, хотя не могу понять, как заставить работать ассоциации. Я пробовал Post.find().where({customerID: customerID}).populate('author').exec(function(err, posts){ res.view({ posts: posts, layout: req.session. макет }); }); В первый раз, когда я что-то публикую, все работает, хотя второй пост будет перенаправлять на мой пост/новый шаблон.. И перестанет работать. Кроме того, как именно Post узнает, какому пользователю он принадлежит? Где он подключается? - person Lars Dol; 28.04.2014
comment
Не зная, как выглядит ваш model, сложно ответить. Я предлагаю вам сделать это, в первую очередь; читайте об ассоциациях в документации по парусам. Если вы не можете понять, почему он работает не так, как вы ожидаете, создайте еще один вопрос здесь, на SO, и я вам помогу :) - person aludvigsen; 29.04.2014
comment
Это было связано с тем, что я получал свои параметры, вызывая var params = req.params.all(). Это смешалось с каким-то случайным идентификатором, который перепутал ватерлинию / паруса-монго. Когда я заменил его на var params = req.body, все заработало как задумано :). - person Lars Dol; 01.05.2014