Nei*_*ton 85 ruby activerecord ruby-on-rails
我有以下代码:
@posts = Post.joins(:user).joins(:blog).select
Run Code Online (Sandbox Code Playgroud)
这是为了查找所有帖子并返回它们以及相关的用户和博客.但是,用户是可选的,这意味着INNER JOIN
该:joins
生成没有返回大量记录.
我如何使用它来生成一个LEFT OUTER JOIN
?
Nei*_*ton 111
@posts = Post.joins("LEFT OUTER JOIN users ON users.id = posts.user_id").
joins(:blog).select
Run Code Online (Sandbox Code Playgroud)
WuT*_*Tan 75
您可以使用includes
Rails指南中记录的内容执行此操作:
Post.includes(:comments).where(comments: {visible: true})
Run Code Online (Sandbox Code Playgroud)
结果是:
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)
Run Code Online (Sandbox Code Playgroud)
pla*_*mbo 11
我是squeel gem的忠实粉丝:
Post.joins{user.outer}.joins{blog}
Run Code Online (Sandbox Code Playgroud)
它支持both inner
和outer
join,以及为多态belongs_to关系指定类/类型的能力.
默认情况下,当您传递ActiveRecord::Base#joins
命名关联时,它将执行INNER JOIN.你必须传递一个表示你的LEFT OUTER JOIN的字符串.
从文档:
:joins
- 用于附加连接的SQL片段,如"LEFT JOIN comments ON comments.post_id = id
"(很少需要),用于该:include
选项的相同形式的命名关联,它将在关联的表上执行INNER JOIN,或者包含两个字符串的混合的数组和命名的协会.如果值是字符串,则记录将以只读方式返回,因为它们将具有与表的列不对应的属性.传递
:readonly => false
覆盖.
activerecord中有一个left_outer_joins方法.你可以像这样使用它:
@posts = Post.left_outer_joins(:user).joins(:blog).select
Run Code Online (Sandbox Code Playgroud)