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

maximumActiveRelationでスコープを使用できます。

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
  1. 整数のソートされていないリストで単一の最大値を見つける最も速い方法は、リストを左から右にスキャンし、それまでの最大値を記憶することです。
  2. 最初にリストを並べ替えると、2 番目、3 番目などの最大値も簡単に見つけられるという追加の利点が得られます。
  3. Rubyに隠されている「最大」メソッドの1つを使用する場合...実装者が最大値を選択するために何をしているのかを確認し、それを上記の1.および2.と比較する必要があります:-)

説明:

このようにすると、リスト内の各値を 1 回だけ選択し、これまでの最大値と 1 回比較するだけです。

n 個のエントリを持つリストを取得した場合、並べ替えには平均で O(n*log n) ops のコストがかかります。明らかに、これはソリューション 1 の O(n) よりも多くなりますが、もう少し得られます。

3. うーん..何が起こるかを知りたいのですが、好みは異なるかもしれません

于 2012-09-05T07:40:49.817 に答える
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 に答える