轨道:从 val.size 中查找最大数字


user = SkillUser.find_all_by_skill_id(skill_id)
user.size
给我: 1 2 2 1 3 1 3 1 3 1

3 2 1 1 3

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

感谢您的帮助

您可以在 ActiveRelation 上使用 maximum 作用域:

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::Computinghttp://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. 如果先对列表进行排序,则会得到轻松找到第二、第三等最大的额外好处也很容易值。
  3. 如果您采用隐藏在 ruby 中的"最大"方法之一......您应该检查实现者正在做什么来选择最大值并将其与 1 进行比较。和 2.以上 :-(

解释:

到 1.这样做,您只需在列表中的每个值中精确选择一次,并将其与到目前为止的最大值进行比较一次。

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

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

最新更新