2014-01-06 25 views
2

我需要在模型中提供類似關聯的內容。所以我有一個名爲Posts的模型,其中包含一個用戶標識,並希望從該用戶名獲取用戶名並顯示它。Sails.js使用回調中的值設置模型值

所以我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; 
    } 
    } 

}; 

我知道這回是行不通的,因爲它是asynchronus ...但我怎麼能在我看來顯示呢?此刻,我retrive與價值:

<%= forumPost.getUsername() %> 

而且可以肯定得到一個不確定的回報...

因此問題是:我怎樣才能返回該值 - 或者是有沒有更好的解決方案比實例化模型?

在此先感謝!

+0

http://stackoverflow.com/questions/17683015/how-to-perform-sql-joins-in-sails-js-waterline – bredikhin

+0

Model.query(,callback);不知道爲什麼它無法找到模型...但是,必須有一種方式來通過回調寬恕回報... – Lugaru

+0

'Model.query(,callback);'是僅適用於SQL DB。你使用哪個適配器? – bredikhin

回答

4

關閉我的頭頂,你只需要加載相關的用戶異步呈現之前:

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版本。

3

因此,您的模型之間的關聯尤其如此。所以在這裏你有一個用戶模型和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測試階段。

+0

嘿,這幾乎解決了它。但我有問題,我有多個Forumposts,而不只是一個。在你的例子中,你只能從一個帖子獲得用戶並顯示這個帖子,但是我在每個otehr下面都有多個帖子 – Lugaru