Ruby on rails 查询嵌套计数

Ruby on rails 查询嵌套计数,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有两个模型,一个用户和一个练习,其中一个用户有很多:练习。用户模型上有一个cache\u计数器,exercise\u count 我想根据用户当月的锻炼次数制作排行榜。我想显示当月锻炼次数最多的2个用户以及锻炼次数。如果有其他用户具有与排名第二的用户相同的锻炼次数,我也希望显示他们。显示2+个用户 我现在的问题是 # User model scope :exercises_this_month, -> { includes(:exercises).references(:exercis

我有两个模型,一个用户和一个练习,其中一个用户有很多:练习。用户模型上有一个cache\u计数器,exercise\u 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+个用户对象。我想将此限制为当前月份。

您不能在此处使用计数器缓存,因为它存储所有时间的数字。另一个问题是,如果你有多个球员有相同数量的训练,你会错过第二大数量的

# 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

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

我最终使用了这个答案的精髓,在练习模型上创建了一个范围,以月为单位进行限制,然后根据这些数量创建了一个用户数组,并从中选择了顶级用户
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