0

我在使用 .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"})

这有道理吗?我在做傻事吗?

4

1 回答 1

6

joins在 Rails 中使用数组或符号参数总是INNER JOIN在 sql 中执行,即使在连接多个表时也是如此。

因此,当您没有同时具有标签和评论的文章(或者那些同时具有标签和评论的文章与您的条件不匹配)时,您将收到一个空结果,因为您仅将这些条件与具有两者的文章的横截面匹配评论标签。

要获得所有带有标签和评论的文章,​​请LEFT JOIN自己做

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

然后应用你的条件。

于 2013-02-11T17:02:46.870 回答