ruby - LEFT OUTER加入Rails 3

我有以下代码:

@posts = Post.joins(:user).joins(:blog).select

这是为了查找所有帖子并返回它们以及相关的用户和博客。但是,用户是可选的,这意味着LEFT OUTER JOIN生成的LEFT OUTER JOIN不会返回大量记录。

我如何使用它来生成LEFT OUTER JOIN

Neil Middleton asked 2019-09-10T05:10:28Z
8个解决方案
111 votes
@posts = Post.joins("LEFT OUTER JOIN users ON users.id = posts.user_id").
              joins(:blog).select
Neil Middleton answered 2019-09-10T05:10:36Z
74 votes

您可以使用Rails指南中记录的includes执行此操作:

Post.includes(:comments).where(comments: {visible: true})

结果是:

SELECT "posts"."id" AS t0_r0, ...
       "comments"."updated_at" AS t1_r5
FROM "posts" LEFT OUTER JOIN "comments" ON "comments"."post_id" = "posts"."id"
WHERE (comments.visible = 1)
WuTangTan answered 2019-09-10T05:11:03Z
11 votes

我是squeel gem的忠实粉丝:

Post.joins{user.outer}.joins{blog}

它支持innerouter连接,以及为多态belongs_to关系指定类/类型的功能。

plainjimbo answered 2019-09-10T05:11:36Z
10 votes

使用eager_load

@posts = Post.eager_load(:user)
Ricardo answered 2019-09-10T05:12:02Z
8 votes

默认情况下,当您传递:readonly => false命名关联时,它将执行INNER JOIN。 你必须传递一个表示你的LEFT OUTER JOIN的字符串。

从文档:

:readonly => false - 用于其他连接的SQL片段,如“LEFT JOIN comments ON comments.post_id = id”(很少需要),命名关联   与用于:include选项的相同形式,将执行   关联表上的INNER JOIN,或包含a的数组   两个字符串和命名关联的混合。

如果值是a   字符串,然后记录将以只读方式返回   具有与表的列不对应的属性。 通过   :readonly => false覆盖。

DBA answered 2019-09-10T05:12:49Z
7 votes

activerecord中有一个left_outer_joins方法。 你可以像这样使用它:

@posts = Post.left_outer_joins(:user).joins(:blog).select
Ahmad Hussain answered 2019-09-10T05:13:15Z
4 votes

好消息,Rails 5现在支持LEFT OUTER JOIN.您的查询现在看起来像:

@posts = Post.left_outer_joins(:user, :blog)
Dex answered 2019-09-10T05:13:42Z
0 votes
class User < ActiveRecord::Base
     has_many :friends, :foreign_key=>"u_from",:class_name=>"Friend"
end

class Friend < ActiveRecord::Base
     belongs_to :user
end


friends = user.friends.where(:u_req_status=>2).joins("LEFT OUTER JOIN users ON users.u_id = friends.u_to").select("friend_id,u_from,u_to,u_first_name,u_last_name,u_email,u_fbid,u_twtid,u_picture_url,u_quote")
Jigar Bhatt answered 2019-09-10T05:14:02Z
translate from https://stackoverflow.com:/questions/3245201/left-outer-joins-in-rails-3