Ruby Active Record加入并包括为count生成不同的sql
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby Active Record加入并包括为count生成不同的sql相关的知识,希望对你有一定的参考价值。
这是我的表格:
User
id: primary key
user_name:
role_id: foreign key **NOT NULL**
--
Role
id: primary key
name:
我正在使用Active Record执行以下语句:
声明1:
User.includes(:role).size
(1.1ms) SELECT COUNT(*) FROM "users"
声明2:
User.joins(:role).size
(1.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "roles" ON "roles"."id" = "user"."role_id"
基于以下事实:
- 外键role_id不为null
- 在没有连接的情况下计数(*)具有更好的性能和资源使用
我很困惑为什么这两个查询生成不同的SQL。更准确的说,为什么连接会生成性能较差的SQL?
答案
ActiveRecord根本就不那么聪明。通过电话
User.joins(:role).size
你告诉它INNER JOIN
roles
表,然后检查计数。
它使用INNER JOIN
甚至计数,因为它不够聪明,因为你有一个外键并且该列不可为空并且roles
表上没有条件,所以实际上并不需要连接。
调用
User.includes(:role).size
不会生成连接,因为您没有告诉ActiveRecord加载所有已定义角色的用户,并且它使用左连接或单独的查询来加载角色。
以上是关于Ruby Active Record加入并包括为count生成不同的sql的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Ruby Active Record 获取 sql 脚本的输出?
Ruby on Rails 变量在视图中显示 Active Record 数据而不是整数
ruby 使用多态数据库模型自动创建Active Record关联:http://api.rubyonrails.org/classes/ActiveRecord/Associat
Ruby on Rails。如何在 :belongs to 关系中使用 Active Record .build 方法?