2013-02-11 55 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