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 を返さないため、最後に呼び出す必要があることに注意してください。
説明:
このようにすると、リスト内の各値を 1 回だけ選択し、これまでの最大値と 1 回比較するだけです。
n 個のエントリを持つリストを取得した場合、並べ替えには平均で O(n*log n) ops のコストがかかります。明らかに、これはソリューション 1 の O(n) よりも多くなりますが、もう少し得られます。
3. うーん..何が起こるかを知りたいのですが、好みは異なるかもしれません
パフォーマンス上の理由から、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