【问题标题】:Displaying Model Association Data显示模型关联数据
【发布时间】:2014-09-10 21:39:45
【问题描述】:

我正在尝试显示多对多关联,但我尝试的所有内容都返回未定义。我基本上是在尝试完全按照这个人的要求 Sails.js Associations many-to-many relation 但他没有得到任何回应。我正在使用 postgres,但我认为这并不重要。

我可以看到为链接两个实体而创建的额外表。基本上我有一个用户、组、角色模型。用户具有多对多的组和角色。当我查看表时,用户模型实际上不包含 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>

用户控制器:

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

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

【问题讨论】:

  • 您能否展示您用于检索记录的代码,并说明您得到的输出是什么(与您的预期相比)?
  • 我在原帖的 EDIT 下添加了它。

标签: sails.js


【解决方案1】:

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

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

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

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

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

将为您提供用户所属组的列表。 Lodash 默认由 Sails 全球化,因此您无需向项目添加任何内容即可使其正常工作。

.populate 的完整文档是 here

【讨论】:

  • 啊,非常感谢!我以前没有遇到过这些文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多