我有一个学校和结果模型,结果属于学校,学校每年都有结果。每个结果都有一个字段:得分,我试图按照得分对每个“结果”进行排名,但仅限每年。因此,每个不同的年份将有不同的排名。
1)实现此排名的最佳方式是什么?
我想到的一种方法是每10分钟运行一次cron作业(例如)更新等级
update_rank.rake
task :build => :environment do
Result.where(year: year).desc(:score).each_with_index do |result, position|
result.update_attribute(:rank, position + 1)
end
end
我有一个问题:
2)我如何为每个不同的年份做排名?我可以做类似下面的事情,但看起来有点笨重,还有什么我可以做的吗?
task :build => :environment do
eachyear = (1990..(Time.now.year)).to_a
eachyear.each do |year|
Result.where(year: year).desc(:score).each_with_index do |result, position|
result.update_attribute(:rank, position + 1)
end
end
end
答案 0 :(得分:0)
如果你想每十分钟更新一次排名,就会有一个很棒的宝石叫做Whenever,它会为你处理cron。 https://github.com/javan/whenever
创建定义特定时间范围的Term或Year模型可能是有意义的。这将使您的计算更容易,并且如果学校通常有不同的时间表,也会更好地扩展。
一个问题是你需要确保在当前结束时产生一个新的术语/年。
示例:
class School
has_many :terms
has_many :results
end
class Term
belongs_to :school
has_many :results
field :start_date
field :end_date
end
class Result
belongs_to :term
belongs_to :school
end
显然,您需要考虑更多信息......但希望这会有所帮助。