我有两个模型,User
和Exercise
,用户has_many :exercises
。 User
模型上有一个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+用户对象。我想将此限制在当月。
答案 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
我不确定你想要什么,但这将是一个很大的帮助,希望享受:)