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)?
感谢您的帮助
答案 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.如果您有一个包含n个条目的列表,则排序成本O(n * log n)ops的平均值。显然,这不仅仅是解决方案1中的O(n),而是你得到的更多
到3.嗯..我更喜欢知道会发生什么,但你的偏好可能会有所不同