我在多个关联上使用.joins时遇到了问题。这是我的模型设置:
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 :(得分:6)
joins
总是在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")
然后应用你的病情。