我需要在我的模型中提供类似关联的东西。所以我有一个名为Posts with a userid的模型,想要从这个用户名中获取用户名并显示它。
所以我的ForumPosts.js模型如下所示:
module.exports = {
schema: true,
attributes: {
content: {
type: 'text',
required: true
},
forumTopicId: {
type: 'text',
required: true
},
userId: {
type: 'integer',
required: true
},
getUsername: function(){
User.findOne(this.userId, function foundUser(err, user) {
var username = user.username;
});
console.log(username);
return username;
}
}
};
我知道这个回归不起作用,因为它是异步的...但是我如何在我的视图中显示它?在瞬间,我用以下方法重新获得价值:
<%= forumPost.getUsername() %>
肯定得到一个不确定的回报...
所以问题是:我怎样才能返回这个值 - 或者是否有比实例模型更好的解决方案?
提前致谢!
答案 0 :(得分:5)
在我的脑海中,您可以在渲染之前异步加载关联的用户:
loadUser: function(done){
var that = this;
User.findOne(this.userId, function foundUser(err, user) {
if ((err)||(!user))
return done(err);
that.user = user;
done(null);
});
}
然后在你的控制器动作中:
module.exports = {
index: function(req, res) {
// Something yours…
forumPost.loadUser(function(err) {
if (err)
return res.send(err, 500);
return res.view({forumPost: forumPost});
});
}
}
并在您看来:
<%= forumPost.user.username %>
这是一种快速而肮脏的方式。对于更加可靠和长期的解决方案(到目前为止仍在开发中),您可以使用Associations API查看Sails v0.10.0的alpha。
答案 1 :(得分:3)
所以这种模型之间关联的特殊情况。所以这里有一个User模型和ForumPost模型,你需要用户对象来代替你的user_id,因为user_id可以作为你的用户模型的关系映射字段。
因此,如果您使用的是风帆V0.9.8或更低版本,则需要在控制器中处理此逻辑,以便在视图中访问用户模型属性。
在你的控制器中写下你的逻辑:
model.export = {
//your getForumPosts method
getForumPosts : function(req,res){
var filters = {};
forumPost.find(filters).done(function(err,posts){
if(err) return res.send(500,err);
// Considering only one post obj
posts = posts[0];
postByUser(posts.user_id,function(obj){
if(obj.status)
{
posts.user = obj.msg;
delete posts.user_id;
res.view({post:posts});
}
else
{
res.send(500,obj.msg);
}
});
}
}
}
function postByUser(user_id,cb){
User.findOne(user_id).done(function(err,user){
if(err) return cb({status:false, msg:err});
if(user){
cb({status:true, msg:user});
}
}
}
然后您可以在视图中访问帖子对象。
否则你可以继续观察(在GitHub上)下一版本的帆,因为他们在V0.10中宣布了关联,它现在处于beta测试阶段。