Rails:找出val.size中的最大数字

时间:2012-09-04 08:14:03

标签: ruby-on-rails size

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)?

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

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

SkillUser.maximum(:rating)

如果您想要一个名为rating的属性的最大值。


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

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

这为您提供了大多数用户的技能的技能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以进一步调整查询范围。

答案 1 :(得分: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

答案 2 :(得分:0)

  1. 在未排序列表中查找单个最大值的最快方法 整数是从左到右扫描列表并记住 迄今为止最大的价值。
  2. 如果您先对列表进行排序,则可以获得 轻松找到第二,第三等最大的额外好处 价值也很容易。
  3. 如果你选择隐藏在ruby中的一个“最大”方法......你应该检查实现者正在做什么来选择最大值并将其与1.和2.上面的比较: - )
  4. 说明:

    到1.这样做,你只需要在列表中选择一个值一次,然后比较一次到目前为止的最大值。

    到2.如果您有一个包含n个条目的列表,则排序成本O(n * log n)ops的平均值。显然,这不仅仅是解决方案1中的O(n),而是你得到的更多

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