0

在您需要找到解决方案之前,rails 非常有趣,而且需要三天时间,但没有运气!;-(

如何按每个条目的 has_many 关联中的最新条目排序?

解释:

Video通过关联的模型Score(带有字段ranking_score)对模型进行排名。数据库是一个postgreSQL。因为我会经常为视频添加分数,所以我需要按每个视频的最新分数条目对视频进行排序。

Video.all(:include => :scores, :order => "scores.ranking_score DESC")

...按预期工作,直到我为视频添加新的分数条目(我不更新,因为我会有关于排名的统计数据)。

我还尝试了所有品种(DESC 和 ASC),我重新排序了优先级,但没有运气:

Video.all(:include => :scores, :order => "scores.created_at DESC, scores.ranking_score")

Video.all(:include => :scores, :order => "scores.ranking_score, scores.created_at")

等等。

我在网上搜索,试图找出 postgreSQL 命令等等。但是,作为一个菜鸟(现在在轨道上呆了 6 周),我需要帮助,拜托。

这是我的代码:

视频型号:

class Video < ActiveRecord::Base
  .
  has_many :scores
  .
end

评分模型:

class Score < ActiveRecord::Base
  attr_accessible :ranking_score, :video_id
  belongs_to :video, :foreign_key => :video_id

  def position
    self.class.count( :conditions => ['ranking_score >= ?', self.ranking_score]) 
  end
end

视频控制器:

class VideosController < ApplicationController

  def index
    setup_videos
    @video ||= Video.new

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @video }
    end
  end
    .
  private
  def setup_videos
    @videos = Video.all(:include => :scores, :order => "scores.ranking_score DESC")
    @user = current_user
  end   
end

如您所见,为了验证排名,我包含了一个方法位置,因为我需要一个特定于用户的视图,其中仅列出用户视频,但显示了总体排名(不同的问题,因为这样它不适用于每个条目的多个条目视频)

_ranking.html.erb(呈现在“索引”中)---没有 HTML 标签:

<% @videos.each.with_index do |video, index| %>
  <%= index.+1 %>
  ranking <%= video.scores.last.ranking_score %>
  postition <%= video.scores.last.position %>
<% end %>
<% @user.videos.count %>

感谢您的时间!约翰

4

1 回答 1

1

我无法理解您的要求。但是 - 你有没有想过缓存每个视频记录的最高排名?

您可以在视频中添加另一列,highest_ranking该列在 Score after_save 操作或类似操作中更新(取决于分数更新频率)。

这将为您省去加入乐谱以订购视频的麻烦。

于 2012-12-27T20:34:50.843 回答