我有以下代码:
@posts = Post.joins(:user).joins(:blog).select
用于查找所有帖子并返回它们以及关联的用户和博客。
但是,用户是可选的,这意味着INNER JOIN
生成的:joins
不会返回大量记录。
如何使用它来生成LEFT OUTER JOIN
?
答案 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)
答案 3 :(得分:10)
使用eager_load
:
@posts = Post.eager_load(:user)
答案 4 :(得分:8)
默认情况下,当您传递ActiveRecord::Base#joins
命名关联时,它将执行INNER JOIN。你必须传递一个表示你的LEFT OUTER JOIN的字符串。
: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")