0

コードを書き直して無駄になる前に、この状況でhas_many:throughアソシエーションを使用する方法についてアドバイスをいただけないでしょうか。

私はユーザーモデルを持っており、各ユーザーは多くのクイズをプレイできます(したがって、多くのクイズスコアを生成できます)。現在、プレーヤーはユーザーの名前をクリックしてゲームを開始します。これにより、そのユーザー(ユーザーhas_many:questions)が行ったすべてのクイズの質問に対するクエリがトリガーされます。

  def startGame 

     user = User.find_by_name(params[:user])
     questions = user.questions

  end 

明らかな理由で、プレーヤーは同じクイズを2回プレイすることはできません。私はそれを防ぐ方法を考え出しましたが、私はそれを効率的な方法で行いませんでした。誰かが私が関連付けテーブルを試すことを提案しました。has_many :through私はこの計画でその関連付けテーブルを始めました

User.rb(このユーザーはプレイヤーとしてのユーザーであり、クイズとしてのユーザーではありません)

has_many :scores
has_many :quizzes, :through => :scores

Quiz.rb

   has_many :scores
   has_many :users    :through => :scores

スコア

   belongs_to :user
   belongs_to :quiz

問題は、現在、クイズモデルやクイズがないことです。クイズは実際には質問(Question.rb)と回答(Answer.rb)で構成されています。たとえば、各ユーザーhas_many :questionsと各質問has_many :answersは次のようになります

User.rb

has_many :questions

Question.rb

has_many :answers

では、クイズモデル(または私がそれと呼ぶもの)を何から作成できますか?

私が思いついたアイデアの1つは、Quiz.rbモデルを作成して実行することでした。

has_many :questions

これは、Question.rbがUser.rbとQuiz.rbの両方に属していることを意味します。

has_many :through次に、ユーザー、クイズ、スコアを使用して上記のように実行できますか?その場合、Scoreにはuser_id(プレーヤー用)とquiz_id(クイズ用)の両方が含まれますが、この関連付け全体の目的は、ユーザーが同じクイズを2回プレイするのを防ぐことであるため、どうすれば作成できるのでしょうか。次のコードで動作します。

  def startGame

   user = User.find_by_name(params[:user])  #this user is the quiz creator
   questions = user.questions
     .....
    #I want to check right here if they've already played the quiz. how to do it with the has_many :through of Quiz, Score, User (as player)

  end

user.rb(player)、score.rb、quiz.rbを設定したら、この状況でこの特定のクイズをプレイしたかどうかをどのように確認しますか。

また、クイズモデルを作成してhas_many:questionsを実行した場合、user.rbもhas_many:questionsであるため、ポリモーフィズムを使用する必要がありますか?

更新:彼らがすでにメソッドでプレイしたかどうかを確認し、プレイしたdef startGame場合はゲームを続行させないようにします。つまり、スコアを保存するときまで待って、そのクイズのスコアがすでに保存されているかどうかを確認したくありません。

4

1 に答える 1

2

あなたのコードはすでにとても良く見えます。プレーヤーがクイズを2回以上プレイできないようにする場合は、ユーザーとクイズの任意の組み合わせを一意にすることができます。これをスコアの移行に追加できます。

add_index :scores, [:user_id, :quiz_id], unique: true

そして、これをスコアモデルに追加します。

validates_uniqueness_of :user_id, scope: quiz_id
于 2013-03-15T04:47:16.153 に答える