LEFT OUTER加入Rails 3

时间:2010-07-14 10:22:30

标签: ruby-on-rails ruby activerecord

我有以下代码:

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

用于查找所有帖子并返回它们以及关联的用户和博客。 但是,用户是可选的,这意味着INNER JOIN生成的:joins不会返回大量记录。

如何使用它来生成LEFT OUTER JOIN

8 个答案:

答案 0 :(得分:111)

@posts = Post.joins("LEFT OUTER JOIN users ON users.id = posts.user_id").
              joins(:blog).select

答案 1 :(得分:75)

您可以使用includes as documented in the Rails guide

执行此操作
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)

答案 2 :(得分:11)

我是squeel gem的忠实粉丝:

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

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

答案 3 :(得分:10)

使用eager_load

@posts = Post.eager_load(:user)

答案 4 :(得分:8)

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

来自the documentation

  

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

     

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

答案 5 :(得分:7)

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

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

答案 6 :(得分:4)

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

@posts = Post.left_outer_joins(:user, :blog)

答案 7 :(得分:0)

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")