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)?
感谢帮助
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)?
感谢帮助
您可以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 以便您进一步确定查询范围。
出于性能原因,您应该使用 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
说明:
到 1. 这样做,您只需选择列表中的每个值恰好一次,并将其与迄今为止的最大值进行比较一次。
到 2。如果您有一个包含 n 个条目的列表,则平均排序成本 O(n*log n) 操作。显然,这比解决方案 1 中的 O(n) 多,但你会得到更多
到 3. 嗯.. 我更喜欢知道会发生什么,但您的偏好可能会有所不同