LEFT OUTERjoinRails 3

我有以下代码:

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

这意味着find所有的职位,并返回他们和相关的用户和博客。 但是,用户是可选的,这意味着INNER JOIN :joins生成不会返回大量的logging。

我如何使用它来生成一个LEFT OUTER JOIN呢?

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

您可以使用includes 在Rails指南中的文档来做到这一点:

 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) 

我是s gegem的粉丝:

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

它支持inner连接和outer连接,以及为多态属性关系指定类/types的能力。

使用eager_load

 @posts = Post.eager_load(:user) 

默认情况下,当你传递ActiveRecord::Base#joins一个指定的关联时,它将执行一个INNER JOIN。 你必须传递一个代表你的左外连接的string。

从文档 :

:joins – 要么是附加连接的SQL片段,比如“ LEFT JOIN comments ON comments.post_id = id ”(很less需要),与用于:include选项的相同forms的命名关联,它将在关联的表上执行INNER JOIN (s)或包含string和命名关联的混合的数组。

如果该值是一个string,则logging将以只读方式返回,因为它们的属性不对应于表的列。 通过:readonly => false覆盖。

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

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

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

 @posts = Post.left_outer_joins(:user, :blog) 
 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")