显示模型关联数据

时间:2014-09-10 21:39:45

标签: sails.js

我正在尝试显示多对多关联,但我尝试的所有内容都返回undefined。我基本上试图做这个人在这里问Sails.js Associations many-to-many relation 但他没有回应。我正在使用postgres,但我认为不重要。

我可以看到创建的额外表来链接这两个实体。基本上我有一个用户,组,角色模型。用户拥有多个组和角色。当我查看表时,User模型实际上不包含group.name或role.name之类的信息,并且创建的关系表仅包含引用该关联的id号。我假设我需要在关联表中找到用户ID与我当前用户ID匹配的所有角色并显示它们。

有两个问题,有没有其他方法可以显示相关记录而无需通过id查询。所以user.roles.name(例如)。或者如何将角色/组名称添加到由sails创建的实际关联表中,而不仅仅显示id号。

用户模型

module.exports = {

  attributes: {

    username: 'string',
    password: 'string',
    firstname: 'string',
    lastname: 'string',
    email: 'string',
    group: {
      collection: 'groups',
      via: 'users',
      dominant: true
    },
    roles: {
      collection: 'role',
      via: 'users',
      dominant: true
    }
  }
};

群组模型

module.exports = {

  attributes: {

    name: 'string',
    users: {
      collection: 'user',
      via: 'group'
    }
  }

};

角色模型

module.exports = {

  attributes: {

    name: 'string',
    users: {
      collection: 'user',
      via: 'roles'
    }

  }

};

感谢您的帮助!

修改

ejs文件

<table>

    <tr>
      <th>ID</th>
      <th>Username</th>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Email</th>
      <th>Groups</th>
      <th>Roles</th>
    </tr>
    <% users.forEach(function(user){ %>
    <tr>
      <td><%= user.id %></td>
      <td><%= user.username %></td>
      <td><%= user.firstname %></td>
      <td><%= user.lastname %></td>
      <td><%= user.email %></td>
      <td><%= user.group.collection %></td>
      <td><%= user.roles.collection %></td>
      <td><a href="/user/edit/<%= user.id%>">Edit</a></td>
    </tr>
    <% }); %>
    </table>

UserController中:

users: function(req, res) {
    User.find().exec(function(err, users){
    res.view({users: users});
    });
  },

我尝试了很多不同的user.roles和user.group变体。我猜这是完全错误但是没有找到关于其他任何东西的文档,只是建立了多对多的关系。

1 个答案:

答案 0 :(得分:2)

在查询用户时,您需要填充关联,如documentation for many-to-many associations中所示。

User.find()
    .populate('group')
    .populate('roles')
    .exec(function(err, users){...}

OR

User.find().populateAll().exec(function(err, users){...}

其中任何一个都会向每个用户添加group数组和roles数组。因此,如果您保持视图代码不变,那么您可能只需获得[Object object]这两列的输出。您可以使用Lodash至少创建以逗号分隔的名称列表。例如:

<td><%= _.pluck(user.group.collection, 'name').join(', ') %></td>

将为您提供用户所属的组列表。默认情况下,Lodash由Sails全球化,因此您不必为项目添加任何内容以使其工作。

.populate的完整文档为here