2015-07-21 39 views
2

模型Rails的ActiveRecord的查詢連接多個表

class AdminUser < ActiveRecord::Base 
    has_many :users 
end 
class User < ActiveRecord::Base 
    has_many :posts 
end 
class Post < ActiveRecord::Base 
    has_many :comments 
end 

我想在這個ADMINUSER下的每個用戶創建的每一個崗位的所有評論列表。

爲了讓每個用戶完成1條評論,所有評論都很簡單。我會用類似

comments=Comment.joins(:post).where("posts.user_id= ?",userid.to_s) 

但是在這裏,我需要去更高一層。即獲得每個用戶在1個admin_user下發表的每條帖子的評論。我以前從未使用過多個連接,所以我有點困惑。

如果我可以用ActiveRecord的關聯字符串內它可能看起來像

 comments=Comment.joins(:post).joins(:user).where("posts.user.admin_user.id=?",adminuser_id) 

但我不能用posts.user.admin_user

回答

0

應該是這樣

Comment.joins(post: :user) 
+0

我認爲,評論屬於帖子和帖子屬於用戶。這就是爲什麼。 – Santanu

+0

閱讀問題。 –

+0

是的,這是我正在尋找的連接。我的最終查詢是Comment.joins(post: :user).where(「user.admin_user_id =?,admin_id) –

2

怎麼樣,我們首先獲取用戶的ID,其屬於管理員用戶,然後習慣於使用您的查詢來選擇評論。

user_ids = admin_user.users.pluck(:id) 
comments=Comment.joins(:post).where("posts.user_id IN (?)", user_ids) 

我假設你粘貼的問題的查詢將工作。

+0

這工作,並感謝回答......但我想學習如何作爲學習多的過程中加入這樣做在1個語句,也是如此。請讓我知道是否有辦法在1行內完成。再次感謝... –

+0

可能是我的錯,但我認爲在這裏它需要內部查詢,我們將在其中獲取user_id:post.user_id IN(內部查詢,我們在其中獲取與admin相關的用戶)。 bcoz,我們需要將posts.user_id與所有user_id對應的管理員進行匹配。即時通訊不是很好的原始sql。:(我會幫你做到這一點:'comment = Comment.joins(:post).where(「posts.user_id IN(?)」,admin_user.users。 pluck(:id))' – Athar