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命令等等。但是,如果你想要帮助的话,那么我现在需要帮助。
这是我的代码:
视频模型:
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 %>
感谢您的时间! JOH
答案 0 :(得分:1)
我很难理解你的要求。但是 - 您是否考虑过使用每个视频记录缓存最高排名?
您可以在名为highest_ranking
的视频中添加另一列,该列会在分数after_save操作或类似内容中更新(取决于分数更新频率)。
这样可以省去加入乐谱订购视频的麻烦。