如何查找最大关联记录数?

时间:2015-01-20 14:51:43

标签: ruby-on-rails ruby

我有AccountsUsers。帐户has_many :users和用户belongs_to :account

我想知道的是任何一个帐户的最大用户数。

因此,它需要遍历所有帐户,总结每个帐户的用户并返回每个帐户的用户数,或者理想情况下,只返回它在所有帐户中找到的最大用户数。

运行Rails 4.0.12和Ruby 2.1.5。

6 个答案:

答案 0 :(得分:7)

您可以循环所有帐户并执行计数,但效率非常低。使用JOINCOUNT

result = Account.select('accounts.id, COUNT(users.id)').joins(:users).group('accounts.id')

结果将是

#<ActiveRecord::Relation [#<Account id: 6>, #<Account id: 4>, #<Account id: 5>, #<Account id: 1>, #<Account id: 3>]>

并且每个项attributes都是

{"id"=>1, "count"=>1}

因此,如果您采用每个result

results.each do |result|
  result.id
  # => the account id
  result.count
  # => the count of user per account
end

将所有内容都放在一个哈希

results.inject({}) do |hash, result|
  hash.merge!(result.id => result.count)
end

答案 1 :(得分:3)

我建议不要对每个帐户进行查询,而是根据您的字段更新查询以进行分组,并按计数排序:

User.group('account_id').order('count_all DESC').limit(1).count

答案 2 :(得分:1)

当然可以这样做:

Account.all.each_with_object({}) do |account, hash|
  hash[account.name] = account.users.count
end

这将返回所有帐户的哈希值,其用户总数为其值。

类似的东西:

=> { "Account1" => 200, "Account2" => 50 }

要对其进行排序,请执行

之类的操作
results = Account.all.each_with_object({}) do |account, hash|
  hash[account.name] = account.users.count
end

sorted = results.sort_by { |acc, ct| ct }.reverse

答案 3 :(得分:0)

class Account < ActiveRecord::Base
 ..
 def self.max_number_of_users
   all.map {|a| a.users.count}.max
 end
 ..
end

答案 4 :(得分:0)

您也可以使用:counter_cache

class User < ActiveRecord::Base
  belongs_to :account, counter_cache: count_of_users
end
class Account < ActiveRecord::Base
  has_many :users
end

http://guides.rubyonrails.org/association_basics.html

答案 5 :(得分:0)

如果您想获得关联具有的最大记录数(这样就可以知道在电子表格中要计划多少列),您可以在一行中完成此操作:

Account.select('accounts.id, COUNT(users.id) as num').left_outer_joins(:users).group('accounts.id').map{|x| x[:num]}.max