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