Ruby on rails Rails:跟踪每个级别的最高分数的策略
我正在开发一个Rails应用程序,它需要跟踪用户玩的每个级别的最高分数 一个级别上的每一次尝试都有多个回合,尝试中每一轮的得分总和将缓存为尝试中的总得分 型号:Ruby on rails Rails:跟踪每个级别的最高分数的策略,ruby-on-rails,activerecord,data-integrity,after-save,Ruby On Rails,Activerecord,Data Integrity,After Save,我正在开发一个Rails应用程序,它需要跟踪用户玩的每个级别的最高分数 一个级别上的每一次尝试都有多个回合,尝试中每一轮的得分总和将缓存为尝试中的总得分 型号: 高分(属于:用户、级别、尝试) 级别(多次尝试) 尝试(有多个:回合,属于:用户,级别) 回合(属于:尝试) 用户(有很多:高分、尝试次数) 在中保存一轮时,将更新该轮所属尝试的总分数。我目前正在使用以下朴素的实现,但计划很快进行重构。在重构之前,我想知道是否有更好的策略来保持这些信息的最新 def update_high_scor
- 高分(属于:用户、级别、尝试)
- 级别(多次尝试)
- 尝试(有多个:回合,属于:用户,级别)
- 回合(属于:尝试)
- 用户(有很多:高分、尝试次数)
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
def更新\u高分\u如果需要
high_score=HighScore.where(用户id:self.user_id,级别id:self.level_id)。首先
如果分数高,则为0?
high\u score=HighScore.create(尝试\u id:self.id,级别\u id:self.level\u id,用户\u id:self.user\u id,分数:self.total\u分数)
其他的
如果高分。分数
我知道我可以查询这些信息,但是,当我想显示所有高分时,我想快速响应,并且如果每次尝试都是在完成时,我希望能够存储。我会认真考虑在RDBMS级别使用存储过程和触发器,这样的东西,甚至可能是虚拟表,但我没有使用Rails模型。以前的虚拟表,这很奇怪,因为我在多层企业桌面应用程序中使用过很多次,所以我不确定Rails是否能在这里很好地发挥作用。无论如何对于可能发生的大量数据计算,让数据库承担负载将是我最好的建议出于好奇,通过一些研究,再加上我刚刚开发的一个测试应用程序,可以看出mySql视图在rails上运行得非常好,性能改进似乎值得付出努力,但需要进行测试在生产环境中证明了可扩展性,并对照您使用的任何RDBMS进行了检查,我知道这不是您所要求的,但绝对值得改变我的想法。谢谢,我必须为我的应用程序尝试一下……我担心它会将一些逻辑移出Rails,但随着应用程序的发展,这可能会发生(我认为这种变化无论如何都会在迁移过程中被冻结)。