查询嵌套计数

时间:2017-09-27 20:40:41

标签: ruby-on-rails ruby activerecord

我有两个模型,UserExercise,用户has_many :exercisesUser模型上有一个cache_counter,exercise_count

我想根据用户在当月的运动计数制作排行榜。我想显示具有最高运动计数的2个用户以及计数。如果其他用户具有与第二位用户相同的运动计数,我也想显示它们。 (显示2个以上的用户)

我当前的查询,

# User model
scope :exercises_this_month, -> {  includes(:exercises).references(:exercises)
  .where("exercise_count > ? AND exercises.exercise_time > ? AND exercises.exercise_time < ?", 
  0 , Time.now.beginning_of_month, Time.now.end_of_month) 
}

def User.leaders
  limit = User.exercises_this_month.where("exercise_count > ?", 0).order(exercise_count: :desc).second.exercise_count
  User.exercises_this_month.where("exercise_count > ? AND exercise_count >= ?", 0, limit)
end

将一直返回前2+用户对象。我想将此限制在当月。

2 个答案:

答案 0 :(得分:1)

您无法在此处使用counter_cache,因为它会始终存储该号码。你遇到的另一个问题是,如果你有多个玩家拥有相同最高数量的练习,你将会错过那些数量第二高的玩家。

# Exercise.rb
scope :exercises_this_month, -> {  
  where("exercises.exercise_time > ? AND exercises.exercise_time <= ?", 
  Time.now.beginning_of_month, Time.now.end_of_month) 
}

#User.rb
players_this_month = User.joins(:exercises).group(:user_id).merge(Exercise.exercises_this_month).count ## 

sorted_counts = players_this_month.values.uniq.sort

if sorted_counts.present?
  second_place_counts = sorted_counts[-2] || sorted_counts[-1]  #in case all have the same number
  top_two_ids = players_this_month.map { |k,v| k if v >= second_place_counts }  ##user ids with top two numbers
end

答案 1 :(得分:0)

gem 'groupdate'
   model 
   def self.by_month(month_num)
       self.where("cast(strftime('%m', created_at) as int) = #
       {Date.today.strftime("%m")}")
   end
   controller 
      def report
         @posts =Post.by_month(Date.today.strftime("%m"))
       end
   view
   some think like this 
      = @posts.group_by_month(:created_at).count

我不确定你想要什么,但这将是一个很大的帮助,希望享受:)