2013-02-11 56 views
0

我在圍繞多個關聯使用.joins時遇到了問題。這是我的模型設置:Rails多個連接返回空集。爲什麼?

class Article 
    has_many :comments 
    has_many :tags 
end 

class Comment 
    belongs_to :article 
end 

class Tag 
    belongs_to :article 
end 

我試圖找到具有特定註釋的身體或與特定標籤的文本標籤註釋的所有文章。這是我的查詢:

Article.joins(:tags, :comments).where("(\"tags\".\"tag\" = 'awesome') OR (\"comments\".\"body\" = 'hello') 

它總是返回一個空的結果。最奇怪的是,這將工作:

Article.joins(:tags).where(:tags => {:tag => "awesome:}) 

但當我添加其他連接符號,什麼都不會返回:

Article.joins([:tags, :comments]).where(:tags => {:tag => "awesome"})

這是否任何意義?我在做一些愚蠢的事情嗎?

+0

是否這樣的情況下,一些標籤文章可能沒有評論(或相反,一些評論文章可能沒有標籤)? – 2013-02-11 16:56:49

回答

6

joins帶有數組或符號參數的Rails在sql中始終執行INNER JOIN,即使在連接多個表時也是如此。

因此,如果您沒有包含標籤和評論的文章(或者那些同時包含標籤和評論的文章與您的條件不符),您將收到一個空的結果,因爲您只將這些條件與橫截面匹配的文章同時有評論標籤。

獲得真正使用標籤和註釋的所有文章,做一個LEFT JOIN自己

Article.joins("LEFT JOIN tags ON tags.article_id = articles.id 
       LEFT JOIN comments ON comments.article_id = articles.id") 

,然後應用你的病情。

+0

完美。正是我需要的! – Ronze 2013-02-11 17:08:17