Rails包含查询条件不返回左表的所有结果

时间:2014-07-07 23:43:42

标签: sql ruby-on-rails postgresql activerecord

我有两张桌子,帖子和图片。以下是schema.rb的相关部分:

create_table "posts", force: true do |t|
  t.string   "name"
  t.string   "body"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "images", force: true do |t|
  t.integer  "post_id"
  t.string   "service_name"
  t.string   "service_url"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我想查找所有帖子并将其与图像表连接,并在图像上使用where子句。我仍然希望所有帖子都返回,即使他们没有与where子句相匹配的图片。

我仍然期望此查询返回所有帖子,即使没有服务名称为" acme"的图像:

Post.includes(:images).where("images.service_name" => "acme")

根据rails guide on querying

  

如果在此包含查询的情况下,对任何帖子都没有评论,则仍会加载所有帖子。通过使用连接(INNER JOIN),连接条件必须匹配,否则不会返回任何记录。

但这不是我所看到的行为。如果没有图片,我的查询中没有得到任何结果包。

我很感激任何想法。

1 个答案:

答案 0 :(得分:4)

如果您在WHERE之后在右侧表的列上添加LEFT JOIN条件,则会强制它像INNER JOIN一样行动。

解决方案

将表达式拉到条件LEFT JOIN 根据{{​​3}}:

  

推荐的方法是使用连接。

  

这将生成一个包含LEFT OUTER JOIN的查询   连接方法将使用INNER JOIN函数生成一个。

你可能误解了这句话。

这个应该做你想做的事:

Post.joins('LEFT OUTER JOIN images ON images.post_id = posts.id
                                  AND images.service_name = $$acme$$')

我不是Ruby专家,但是得出这个the manual page you quoted yourself 不知道如何逃避单引号,所以我转而使用美元报价。