在序列化列上保存和更新

时间:2013-03-14 23:53:17

标签: ruby-on-rails ruby

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

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

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

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

  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})

1 个答案:

答案 0 :(得分:1)

首先,我将数据库中的值存储为"2","4","6"而不是["2","4","6"]。 <{1}}和[不是必需的。

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

Array#join