Ruby 使用带计数的解释

Ruby 使用带计数的解释,ruby,ruby-on-rails-3,ruby-on-rails-4,activerecord,Ruby,Ruby On Rails 3,Ruby On Rails 4,Activerecord,在Rails中,有一个有用的方法可以显示一个查询需要多长时间以及它是什么查询 方法是“解释” 所以我可以做到: User.where(name: 'Johnny').explain 它将显示实际的sql查询 “count”方法也会进行sql查询,但由于“count”返回的是一个数字而不是活动记录,因此我无法对其使用explain。 有什么方法可以做到这一点吗?这种方法有效: User.select('count(*)').where(name: 'Johnny').explain 编辑:这确

在Rails中,有一个有用的方法可以显示一个查询需要多长时间以及它是什么查询

方法是“解释”

所以我可以做到:

User.where(name: 'Johnny').explain
它将显示实际的sql查询

“count”方法也会进行sql查询,但由于“count”返回的是一个数字而不是活动记录,因此我无法对其使用explain。 有什么方法可以做到这一点吗?

这种方法有效:

User.select('count(*)').where(name: 'Johnny').explain
编辑:这确实是完全相同的:

irb(main):004:0> Benutzer.where(login: 'xxx').count
   (2.2ms)  SELECT COUNT(*) FROM "BENUTZER" WHERE "BENUTZER"."LOGIN" = 'xxx'
=> 0
irb(main):005:0> Benutzer.select("count(*)").where(login: 'xxx').explain
  Benutzer Load (0.9ms)  SELECT count(*) FROM "BENUTZER" WHERE "BENUTZER"."LOGIN" = 'xxx'
=> EXPLAIN for: SELECT count(*) FROM "BENUTZER"  WHERE "BENUTZER"."LOGIN" = 'xxx'
Plan hash value: 1339361075

-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |     1 |    12 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |          |     1 |    12 |            |          |
|*  2 |   TABLE ACCESS FULL| BENUTZER |     1 |    12 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("BENUTZER"."LOGIN"='xxx')

Note
-----
   - dynamic sampling used for this statement (level=2)

这与解释计数方法并不完全相同。如果在复杂的情况下,count方法生成的sql查询与select方法不同,则这是不够的。请参阅编辑,它是相同的。当然,如果存在复杂的情况(例如涉及distinct或order by的情况),则必须注意“按摩”语句,以便生成相同的代码。
count
实际上不是一个查询,而是一个根据查询结果运行的函数。复杂性在于
FROM
WHERE
需要
解释
ing。
计数
是SQL查询的一部分,因此“真正”是查询。它在DB内部运行,而不是在rails中运行。