【发布时间】:2012-02-06 04:16:07
【问题描述】:
我正在尝试构建一个网站,对特定赛事中选定运动员的表现进行排名 - 我之前发布了一个问题,收到了一些很好的回应,我确定了我目前代码的关键问题。
我有 2 个模型 - Athlete 和 Result(运动员有很多结果)
每个运动员可以有多个特定事件的记录时间,我想确定每个运动员的最快时间,并将这些最快时间在所有运动员中排名。
我使用以下代码:
<% @filtered_names = Result.where(:event_name => params[:justevent]).joins(:athlete).order('performance_time_hours ASC').order('performance_time_mins ASC').order('performance_time_secs ASC').order('performance_time_msecs ASC') %>
这成功地对所有运动员的所有结果进行了排名(即一名运动员可以在不同的地方出现多次,具体取决于他们记录的时间)。
我现在希望只为每个运动员提取最好的成绩并将他们列入排名。我可以使用以下方法选择与最佳结果相对应的时间:
<% @currentathleteperformance = Result.where(:event_name => params[:justevent]).where(:athlete_id => filtered_name.athlete_id).order('performance_time_hours ASC').order('performance_time_mins ASC').order('performance_time_secs ASC').order('performance_time_msecs ASC').first() %>
但是,当我尝试识别@filtered_names 中列出的不同运动员姓名时,我的问题就出现了。我尝试使用<% @filtered_names = @filtered_names.select('distinct athlete_id') %>,但这并不符合我的预期,有时它会以错误的顺序获得排名。
我发现,就目前而言,我的代码本质上是寻找不同运动员结果之间的差异,从小时时间开始,一直到分钟、秒和毫秒。一旦发现每个不同运动员的结果之间存在差异,它就会相应地对其进行排序。
例如,如果我有 2 名运动员:
Time for Athlete 1 = 0:0:10:5
Time for Athlete 2 = 0:0:10:3
这将产生顺序,运动员 2,运动员 1
但是,如果我有:
Time for Athlete 1 = 0:0:10:5
Time for Athlete 2 = 0:0:10:3
Time for Athlete 2 = 0:1:11:5
然后将顺序指定为运动员 1,运动员 2,因为第一个差异在分钟数中,而运动员 2 较慢...
任何人都可以提出一种解决此问题的方法,并基本上将@filtered_names 中的条目在第一次出现时提取每个名称(即保持名称在@filtered_names 中首次出现的顺序)
感谢您的宝贵时间
【问题讨论】:
标签: sql ruby-on-rails ruby-on-rails-3