2016-07-14 41 views
1

用戶有很多帖子。Rails加入或包含belongs_to條件

class User 
    has_many :posts 
end 

帖子屬於用戶。

class Post 
    belongs_to :user 
end 

我試圖找到所有帖子用戶管理發表

我已經試過:

Post.where(status: 'published').includes(:user).where(users: { admin: true }) 

我得到:

PG::AmbiguousColumn: ERROR: column reference "admin" is ambiguous 

回答

6

您可以用手的ActiveRecord::Relation大部分範圍的方法來構建複雜的查詢。例如:

Post.where(status: 'published', user: User.where(admin: true)).includes(:user) 

這應該會產生兩個查詢;其中一個將包含具有管理條件的用戶的子查詢,另一個將加載用戶(急切加載)。

請注意,您可以簡化這些查詢了不少與範圍,這讓你列的細節問題細節模型的責任:

class User < ApplicationRecord 
    scope :admin, -> { where(admin: true) } 
end 

class Post < ApplicationRecord 
    scope :published, -> { where(status: 'published') } 
end 

# posts from admin users, with eager loaded users 
Post.published.where(user: User.admin).includes(:user) 

乾杯!

+0

好多了! :) –

+0

要清楚,這將生成一個帶有子查詢的頂級查詢,而不是兩個查詢。區別在於子查詢的結果將傳遞給數據庫級別的頂級查詢,這比查詢應用程序中的兩個單獨查詢的性能更高。 –

+0

@NicNilov這是不正確的。正如解釋的那樣,第二個查詢是由於急切的加載。給它一個旋轉。 – coreyward

-1

添加到更詳細的@ coreyward的答案,如果你想要去無子查詢,你可以指定users條件更明確:

Post.where(status: 'published'). 
    includes(:user). 
    references(:user). 
    where('users.admin = ?', true) 

,這將產生一個適當的LEFT OUTER JOIN查詢。

+0

更新爲使用'參考'來執行'JOIN'。 –