在Ruby中获取具有某些属性的用户计数的最有效方法

时间:2015-08-17 16:55:11

标签: ruby-on-rails angularjs

我有一个users的集合,其中包含各种状态:activedisableddeleted(作为枚举)。我想要计算每个状态的用户数以及用户总数。对我来说最有效的方法是什么?

我已经阅读了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个用户。我不需要比这更高。

提前致谢!

3 个答案:

答案 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