我有一个users
的集合,其中包含各种状态:active
,disabled
或deleted
(作为枚举)。我想要计算每个状态的用户数以及用户总数。对我来说最有效的方法是什么?
我已经阅读了size vs. length vs. count in Ruby上的问题,这让我觉得我应该加载所有用户记录,然后多次遍历集合以获得每个状态数组的长度。
这是我目前的代码:
# pagination code omitted...
all_users = User.all
total_count = all_users.length
active_count = all_users.select {|u| u.status == User.statuses['active']}.length
disabled_count = all_users.select {|u| u.status == User.statuses['disabled']}.length
deleted_count = all_users.select {|u| u.status == User.statuses['deleted']}.length
来自客户端的请求大约需要1.25-1.5秒,为1,000个用户编写。
我也尝试使用以下代码进行多个数据库查询:
# pagination code omitted...
total_count = User.count
active_count = User.where(status: User.statuses['active']).count
disabled_count = User.where(status: User.statuses['disabled']).count
deleted_count = User.where(status: User.statuses['deleted']).count
这可能会略微快〜100ms。有更快的方法吗?
我不确定它是否相关,但是对于背景信息:我在这个上下文中使用Rails作为一个AngularJS前端的API。我使用Kaminari对集合进行分页,但我仍然需要计算每个状态。我在B2B环境中,因此任何实例都不可能拥有超过1,000个用户。我不需要比这更高。
提前致谢!
答案 0 :(得分:2)
通过对计数查询进行分组,在数据库中一次完成所有操作。
webdriver-manager
然后获取用户总数只是对结果求和。这是我的一张桌子上的一个例子。在这里,我将分组布尔字段,但您可以根据需要进行分组。
User.group(:status).count
答案 1 :(得分:0)
这可能会略微快〜100毫秒。
为您的状态'创建一个索引。数据库中的列:
new Regex(@"(([[[{""]))", RegexOptions.Compiled)
答案 2 :(得分:0)
你应该对它们进行基准比较并让我们知道。会很有趣。纯SQL的答案总是更具可扩展性......
u = User.select('user.status')
active_count = 0
disabled_count = 0
deleted_count = 0
u.each do |u|
if u.status = 'active'
active_count += 1
elsif u.status = 'deleted'
deleted_count +=1
else
disabled_count +=1
end
end