【问题标题】:Rails multiple joins return empty set. Why?Rails 多个连接返回空集。为什么?
【发布时间】:2013-02-11 16:48:33
【问题描述】:

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

这有意义吗?我在做傻事吗?

【问题讨论】:

  • 是不是有些带标签的文章可能没有cmet(或者相反有些评论的文章可能没有标签)?

标签: ruby-on-rails associations rails-activerecord


【解决方案1】:

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

所以当你没有同时有标签和cmets的文章时(或者那些同时有标签和cmets的文章不符合你的条件),你会收到一个空的结果,因为你只匹配这些条件的横截面同时具有 cmets 标签的文章。

要获得所有带有标签和 cmets 的文章,请自己做一个LEFT JOIN

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

然后应用你的条件。

【讨论】:

  • 完美。正是我需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2015-10-26
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多