0

醜いコードを前もってお詫びします(動作しないことに加えて)。

私は、さまざまなユーザーによって作成されたさまざまなクイズ ゲームをプレイする多くのユーザーがいる 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})
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 に答える