2010-10-23 105 views
2

我有用戶,帖子和評論。用戶只能向每個帖子發佈一條評論。檢索給定用戶評論的所有帖子,Ruby on Rails

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :comments 
end 

class Post < ActiveRecord::Base 
    has_many :comments 
    belongs_to :user 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 
end 

在userpage(http://host/users/1例如)我想說明在特定用戶評論的所有訊息。然後每篇文章將有所有其他評論。

我可以做這樣的事情在我的用戶控制:

def show 
    @user = User.find(params[:user_id]) 
    @posts = [] 
    user.comments.each {|comment| @posts << comment.post} 
end 

這樣,我會找到用戶,那麼他所有的意見,然後相應的後交於每個註釋,然後(在我看來),每個發佈我將呈現post.comments。我在Rails中是全新的,所以我可以做到這一點=)但我認爲它有點不好,有更好的方法來做到這一點,也許我應該使用範圍或named_scopes(不知道這是什麼,但看起來像害怕)。

那麼你能指出我在正確的方向嗎?

回答

5

您可以定義一個關聯,它可以在單個查詢中檢索包含註釋的所有帖子。將它保留在模型中可以降低控制器的複雜性,使您可以重新使用關聯並使單元測試更加輕鬆。

class User < ActiveRecord::Base 
    has_many :posts_with_comments, :through => :comments, :source => :post 
    # ... 
end 

:throughhas_many到指定連接,通過它來執行查詢表中的一個選項。我們需要指定:source,因爲Rails將無法從:post_with_comments推斷出源。

最後,更新您的控制器以使用關聯。

def show 
    @user = User.find(params[:user_id]) 
    @posts = @user.posts_with_comments 
end 

要了解更多關於:through:source看一看的documentation

+0

我不得不承認,我第一次讀這本書時迷路了,因爲我的思想還停留在「用戶 - >帖子 - >評論」的關係上。但是,經過幾次審查之後,我對'用戶 - >評論 - >帖子'心智模型進行了調整。評論看起來像一個經典的多對多映射模型,然後這一切似乎都很簡單! – 2010-10-23 14:09:56

+0

哇!它效果很好。比我想象的更容易。謝謝。 – fetsh 2010-10-23 14:17:18

+0

@愛德華你在指甲上。 'has_many:through =>'與has_and_belongs_to_many'或多或少相同,只是'has_many:through =>'可以讓你處理連接關聯。這就是常見的用例,儘管它對@ilzoff所做的也很完美。 – 2010-10-23 14:21:47

0

當你得到用戶,你有他的職位關聯,每個職位有他的意見。 你可以寫: (我不知道你的表中的字段名稱,所以我叫文文)

# In Controller 
@user = User.find(params[:user_id]).include([:posts, :comments]) 

# In View 
@user.posts.each do |post| 
    post.text 
    # Comments to the Post 
    post.comments.each do |comment| 
    comment.text 
    end 
end 

我沒有測試的代碼,所以可能會有一些錯誤。

+0

這不完全是我想要的。我不是需要所有用戶的帖子,而是通過用戶評論的所有帖子。你可以看到,泰特約翰遜的答案,它適用於我。 – fetsh 2010-10-23 14:21:53

相關問題