我正在开发一个 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
我知道我可以只查询此信息,但是当我想显示所有高分时我想要快速响应,并且我希望能够存储每次尝试在当时是否都是高分完全的。