有条件地引用实例变量Ruby / Rails

时间:2014-02-16 15:45:48

标签: ruby-on-rails ruby devise

这是我关于stackoverflow的第一个问题。 我试图搜索类似的但到目前为止一无所获。 另外,我是Ruby / Rails开发人员的新手,所以也许我完全错过了基本概念。

但是,让我们谈谈这一点 我的应用基本上是一款游戏。在游戏结束时,玩家(已经是Devise登录的用户)会显示他获得的分数 当玩家点击“排名”按钮时,该分数然后通过JavaScript发送到服务器,作为“排名”页面的URL中的查询字符串,其中显示排名前5的排名。随着分数被发送刚刚结束的游戏的难度,所以等级将指代那个难度级别。

因此我们调用了Pages控制器的“排名”操作。我想要做的是更新用户的“max_score”,即检查当前分数是否大于“max_score”属性并相应地更新属性。由于我们有这三种不同的难度级别,因此用户实际上具有与最高分相关的三个属性:max_easy,max_medium,max_hard。

因此,我首先需要检查必须考虑三个属性中的哪一个,然后评估“大于”条件。
我决定在User模型中定义一个方法,由Pages#ranking调用。以下是代码:

def update_max_score(diff,score)

  @ref_score = self.max_easy if diff == "easy"
  @ref_score = self.max_medium if diff == "medium"
  @ref_score = self.max_hard if diff == "hard"

  if score.to_i > @ref_score
    @ref_score= score.to_i
  end
end

但是实际的实例属性没有更新,即使从控制台调用该方法也是如此。 到目前为止,我发现使用此方法的唯一方法是明确使用self.max_easy OR self.max_medium,这本身并不是邪恶的,但肯定意味着将指令重复三次。

另外,我想知道,为了将来的参考,这个分配有什么问题:我无法得到它。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您想要更新数据库中的列,因此您应该使用ORM method

def update_max_score(diff, score)
  update_attributes "max_#{diff}" => [send("max_#{diff}"), score.to_i].max
end