为丑陋的代码提前道歉(除了它不起作用)。
我有一个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
通过以下代码的各种组合,我在尝试更新时继续删除/重置测验列,或者当我想要['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})
答案 0 :(得分:1)
首先,我将数据库中的值存储为"2","4","6"
而不是["2","4","6"]
。 <{1}}和[
不是必需的。
我会使用]
将数据库中的字符串转换为可在代码中使用的数组。我会使用String#split
将代码中使用的数组转换回字符串以存储在数据库中。
Array#join