Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:跟踪每个级别的最高分数的策略_Ruby On Rails_Activerecord_Data Integrity_After Save - Fatal编程技术网

Ruby on 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

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

一个级别上的每一次尝试都有多个回合,尝试中每一轮的得分总和将缓存为尝试中的总得分

型号:

  • 高分(属于:用户、级别、尝试)
  • 级别(多次尝试)
  • 尝试(有多个:回合,属于:用户,级别)
  • 回合(属于:尝试)
  • 用户(有很多:高分、尝试次数)
在中保存一轮时,将更新该轮所属尝试的总分数。我目前正在使用以下朴素的实现,但计划很快进行重构。在重构之前,我想知道是否有更好的策略来保持这些信息的最新

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,但随着应用程序的发展,这可能会发生(我认为这种变化无论如何都会在迁移过程中被冻结)。