提前为丑陋的代码道歉(除了它不起作用)。
我有一个 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})