一对一的关联是否应该填充双方?

Should one-to-one associations populate both sides?

我有两个模型(用户和代理)。然后我创建一个用户和一个代理。我希望在为 /user 和 /agent 使用蓝图路由时看到关联。我只看到用户模型通过 /agent 蓝图与代理相关联。 /user 蓝图没有任何 reference/association 代理。

当我尝试使用以下命令通过用户 ID 访问代理时,问题就出现了:

User.findOne(req.body.userId).populate('agent').exec(function(err, agent)

"agent"实际上是用户信息...不是代理。

这是我的模型:

用户:

attributes: {
  agent: {
    model: 'agent',
    via: 'owner'
  }
}

代理人:

attributes: {
  owner: {
    model: 'user'
  }
}

感谢阅读!

你理解的populate错了。 populate() 不会用新信息替换上次通话。它从模型中获取属性(您在 populate('attribute') 中指定)并将模型中该属性的 ID 替换为通过其 ID 查找的另一个模型信息。

让我们深入研究示例。

您有 UserAgent 模型。

// api/models/User.js
module.exports = {
  attributes: {
    agent: {
      model: 'Agent',
      via: 'owner'
    }
  }
};

// api/models/Agent.js
module.exports = {
  attributes: {
    owner: {
      model: 'User',
      via: 'agent'
    }
  }
};

您正在呼叫 User.findOne(userId).populate('agent').exec(function(err, user) {},据我所知,您预计只会收到 agent。错误的。它 returns User 模型以 Agent 模型作为 User 模型的属性。

// api/controllers/AnyController.js
module.exports = {
  index: function(req, res) {
    User
      .findOne(req.param('userId'))
      .populate('agent')
      .then(function(user) {
        console.log(user); // User information
        console.log(user.agent); // Agent information for that user
        return user;
      })
      .then(res.ok)
      .catch(res.negotiate);
  }
};

您可以在此处阅读更多有关人口的信息 - http://mongoosejs.com/docs/populate.html

Sails 不完全支持一对一模型关联——您必须在两侧设置 "foreign key"。有关详细信息,请参阅 。我很想把这个问题作为那个问题的副本来关闭,但设置略有不同。