我有Accounts
和Users
。帐户has_many :users
和用户belongs_to :account
。
我想知道的是任何一个帐户的最大用户数。
因此,它需要遍历所有帐户,总结每个帐户的用户并返回每个帐户的用户数,或者理想情况下,只返回它在所有帐户中找到的最大用户数。
运行Rails 4.0.12和Ruby 2.1.5。
答案 0 :(得分:7)
您可以循环所有帐户并执行计数,但效率非常低。使用JOIN
和COUNT
。
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
答案 5 :(得分:0)
如果您想获得关联具有的最大记录数(这样就可以知道在电子表格中要计划多少列),您可以在一行中完成此操作:
Account.select('accounts.id, COUNT(users.id) as num').left_outer_joins(:users).group('accounts.id').map{|x| x[:num]}.max