醜いコードを前もってお詫びします(動作しないことに加えて)。
私は、さまざまなユーザーによって作成されたさまざまなクイズ ゲームをプレイする多くのユーザーがいる Rails アプリを持っています。各クイズが特定のユーザーによって作成されていることを除いて、ユーザーとクイズの間に Rails スタイルの関連付けはありません。実際には、アプリケーションには「クイズ」モデルさえありません (クイズは質問と回答のモデルで構成されています)。
明らかな理由により、ユーザーは各クイズに一度しか挑戦できません。したがって、特定のユーザーがどのユーザーのクイズを試したかを記録する必要があります。['2','4','10']
したがって、 ID 2、4、および 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 番目のユーザーのゲームをプレイすると、ゲームの配列に追加します (つまり、プレイヤーのクイズ列は ['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})