0

提前为丑陋的代码道歉(除了它不起作用)。

我有一个 Rails 应用程序,其中有许多用户玩不同的问答游戏,这些游戏是由不同的用户创建的。用户和测验之间没有 Rails 样式的关联,除了每个测验都是由特定用户完成的。应用程序中实际上甚至没有“测验”模型(测验由问答模型组成)。

出于显而易见的原因,用户只能尝试每个测验一次;因此,我必须记录特定用户尝试了哪些用户的测验。因此,我在用户模型上创建了一个“测验”属性,并将其序列化,这样['2','4','10']如果我玩过 ID 为 2,4 和 10 的用户所做的测验,我希望有一个这样的数据库列。

在用户模型中,创建 :quiz 作为“字符串”后,我这样做是为了将字符串转换为数据库中的数组

  attr_accessible :quiz
  serialize :quiz

但是,我在编写执行以下所有操作的代码时遇到了很多麻烦

a) 检查该列是否不为空(也许玩家还没有参加过测验):我做player.quiz?了测试。

b)检查数组是否包含特定的 user.id(即,如果玩家已经玩过那个测验)我做 player.quiz.include?(user.id.to_s)测试

c) 如果用户尚未进行任何测验,则创建第一个条目。我做了quiz = user.id.to_s

d)一旦用户玩了第二个用户的游戏(即玩家的测验列是 ['2'] 并且现在他们按 user.id 4 进行测验),就将其添加到游戏数组中。

使用下面代码的各种组合,当我尝试更新时,我会一直擦除/重置测验列,或者当我想要 ['6','8'] 时,我正在创建像 '68' 这样的字符串。

如果您能给我一些解决此问题的建议,我将不胜感激。

代码不工作

       if player && player.quiz? && player.quiz.include?(user.id.to_s) #checks if signed in (if player), if the player.quiz column isn't empty, and if it includes a user id

          alreadyplayedthisquiz = true
       else
           if player.quiz?            #it might be that no quizzes are registered on db

            quiz = player.quiz     #this is a string
            quiz.push(user.id.to_s)  #can't push onto a string
            quiz += user.id.to_s    #this is wrong, because if I've played quiz 6 and 8, it'll be '68' in the db
           else 
            quiz = user.id.to_s     #if no quiz on player's db, create first one

           end

          alreadyplayedthisquiz = false
      end

      player.update_attributes({quiz: quiz})
4

1 回答 1

1

首先,我会将值存储在数据库中,"2","4","6"而不是["2","4","6"]. []不是必需的。

我将使用String#split将数据库中的字符串转换为可在代码中使用的数组。我会使用Array#join将代码中使用的数组转换回字符串以存储在数据库中。

quiz = player.quiz? ? player.quiz.split(",") : []
alreadyplayedthisquiz = quiz.include? user.id.to_s
if (!alreadyplayedthisquiz)
  quiz.push user.id.to_s
  player.update_attributes({:quiz => quiz.join(",")})
end
于 2013-03-15T00:18:06.493 回答