【发布时间】:2016-08-29 04:43:04
【问题描述】:
现在我用
Appointment.where.not(time: nil).count
是否可以通过Appointment.count 做到这一点?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5
现在我用
Appointment.where.not(time: nil).count
是否可以通过Appointment.count 做到这一点?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5
如果您想使用.count 实现此目的,您必须从数据库中加载所有对象,然后使用 ruby 计数。 (来自文档:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html#method-i-count)
所以正确的方法就是你已经拥有的。它构建查询以计算时间列不为空的所有对象。
为什么要改变它?
【讨论】:
Appointment.where.not(time: nil) 是否存在 sql 性能问题?生成的 sql 是 select * from ... 但不是 `SELECT COUNT(column_name) FROM ...'
Appointment.where.not(time: nil).count,这将生成:SELECT COUNT(*) FROM "appointments" ...。因为count 方法是一个ActiveRecord 实现的方法。不是数组上的ruby核心方法。