1

我正在开发一个 Rails 应用程序,该应用程序需要跟踪用户在他们玩的每个级别的最高分。

一个级别的每次尝试都有多个轮次,尝试中每轮的得分总和在尝试中缓存为 total_score。

楷模:

  • 高分(belongs_to:用户、级别、尝试)
  • 级别(has_many:尝试)
  • 尝试(has_many:回合,belongs_to:用户,级别)
  • 回合(belongs_to:尝试)
  • 用户(has_many:high_scores,尝试)

当一轮保存更新时,它所属的尝试的总得分。我目前正在使用以下幼稚的实现,但计划很快重构。在我重构之前,我想知道是否有更好的策略来更新这些信息。

def update_high_score_if_needed
  high_score = HighScore.where(user_id: self.user_id, level_id: self.level_id).first
  if high_score.nil?
    high_score = HighScore.create(attempt_id: self.id, level_id: self.level_id, user_id: self.user_id, score: self.total_score)
  else
    if high_score.score < self.total_score
      high_score.update_attributes(attempt: self, score: self.total_score)
      self.update_attribute(:was_high_score, true)
    else
      record_attempt = self.user.attempts.where(level_id: self.level_id).order('total_score DESC').first
      if record_attempt.nil?
        high_score.destroy
      else
        high_score.update_attributes(attempt: record_attempt, score: record_attempt.total_score)
      end
    end
  end
end

我知道我可以只查询此信息,但是当我想显示所有高分时我想要快速响应,并且我希望能够存储每次尝试在当时是否都是高分完全的。

4

0 回答 0