Rails多个连接返回空集.为什么?

Ron*_*nze 0 ruby-on-rails associations rails-activerecord

我在多个关联上使用.joins时遇到了问题.这是我的模型设置:

class Article
  has_many :comments
  has_many :tags
end

class Comment
  belongs_to :article
end

class Tag
  belongs_to :article
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试查找所有带有特定评论正文的评论或带有特定标记文本的标记的文章.这是我的查询:

Article.joins(:tags, :comments).where("(\"tags\".\"tag\" = 'awesome') OR (\"comments\".\"body\" = 'hello')
Run Code Online (Sandbox Code Playgroud)

它总是返回一个空结果.最奇怪的是这会起作用:

Article.joins(:tags).where(:tags => {:tag => "awesome:})
Run Code Online (Sandbox Code Playgroud)

但是当我添加其他连接符号时,不会返回任何内容:

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

这有意义吗?我做了些蠢事吗?

Bea*_*rtz 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")
Run Code Online (Sandbox Code Playgroud)

然后申请你的条件.