コードを書き直して無駄になる前に、この状況で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
場合はゲームを続行させないようにします。つまり、スコアを保存するときまで待って、そのクイズのスコアがすでに保存されているかどうかを確認したくありません。