与mongoid排名

时间:2013-08-15 11:48:50

标签: ruby-on-rails mongoid rank rake-task

我有一个学校和结果模型,结果属于学校,学校每年都有结果。每个结果都有一个字段:得分,我试图按照得分对每个“结果”进行排名,但仅限每年。因此,每个不同的年份将有不同的排名。

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

1 个答案:

答案 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

显然,您需要考虑更多信息......但希望这会有所帮助。