我有两张桌子,帖子和图片。以下是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")
如果在此包含查询的情况下,对任何帖子都没有评论,则仍会加载所有帖子。通过使用连接(INNER JOIN),连接条件必须匹配,否则不会返回任何记录。
但这不是我所看到的行为。如果没有图片,我的查询中没有得到任何结果包。
我很感激任何想法。
答案 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 不知道如何逃避单引号,所以我转而使用美元报价。