2
user = SkillUser.find_all_by_skill_id(skill_id)
user.size

给我: 1 2 2 1 3 1 3 1 3 2 1 1 3

如何从这行数字中获得最大值(在本例中为 3)?

感谢帮助

4

3 回答 3

4

您可以maximum在 ActiveRelation 上使用范围:

SkillUser.maximum(:rating)

如果你想要一个名为rating.


如果要计算每个技能 ID 的用户数,请尝试:

SkillUser.count(:group => :skill_id).max_by { |skill_id,count| count }

这将为您提供 Skill_id 和大多数用户的技能的用户数。

要获得更有效的方法(通过在 SQL 中进行整个计算),请尝试:

SkillUser.limit(1).reverse_order.count(:group => :skill_id, :order => :count)
# Giving the SQL:
# => SELECT COUNT(*) AS count_all, "skill_users"."skill_id" AS skill_id
#    FROM "skill_users" GROUP BY "skill_users"."skill_id"
#    ORDER BY "skill_users"."count" DESC LIMIT 1

请注意,count必须最后调用它,因为它不会返回 ActiveRelation 以便您进一步确定查询范围。

于 2012-09-04T08:15:45.850 回答
0

出于性能原因,您应该使用 ActiveRecord::Calculations http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html

1.9.3-194 (main):0 > User.maximum(:id)
   (1.6ms)  SELECT MAX("users"."id") AS max_id FROM "users" 
=> 3
于 2012-09-04T08:34:21.940 回答
0
  1. 在未排序的整数列表中找到单个最大值的最快方法是从左到右扫描列表并记住迄今为止的最大值。
  2. 如果您首先对列表进行排序,您还可以获得轻松找到第二、第三等最大值的额外好处。
  3. 如果您采用隐藏在 ruby​​ 中的“最大”方法之一......您应该检查实施者正在做什么来选择最大值并将其与上面的 1. 和 2. 进行比较:-)

说明:

到 1. 这样做,您只需选择列表中的每个值恰好一次,并将其与迄今为止的最大值进行比较一次。

到 2。如果您有一个包含 n 个条目的列表,则平均排序成本 O(n*log n) 操作。显然,这比解决方案 1 中的 O(n) 多,但你会得到更多

到 3. 嗯.. 我更喜欢知道会发生什么,但您的偏好可能会有所不同

于 2012-09-05T07:40:49.817 回答