Ruby on rails 查询嵌套计数
我有两个模型,一个用户和一个练习,其中一个用户有很多:练习。用户模型上有一个cache\u计数器,exercise\u count 我想根据用户当月的锻炼次数制作排行榜。我想显示当月锻炼次数最多的2个用户以及锻炼次数。如果有其他用户具有与排名第二的用户相同的锻炼次数,我也希望显示他们。显示2+个用户 我现在的问题是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
# 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