2013-03-15 27 views
0

我想知道如果你可以給我一些關於如何使用has_many的建議:通過關聯在這種情況下,我花了很多時間重寫我的代碼,可能沒有無濟於事。如何使這項工作作爲has_many:通過

我有一個用戶模型,每個用戶都可以玩很多測驗(因此會生成很多測驗分數)。現在,玩家通過點擊一個用戶名,這將觸發查詢所有問答題是用戶(用戶的has_many:題)開始遊戲取得了

def startGame 

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

    end 

出於顯而易見的原因,玩家可以兩次玩同樣的測驗。雖然我想出了一種防止這種方式的方法,但我並沒有採取有效的方法。有人建議我嘗試關聯表。我開始該關聯表作爲這一計劃

User.rb一個has_many :through(該用戶是用戶,作爲玩家,而不是用戶的-測驗製造商)

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像這樣

User.rb每個問題has_many :answers

has_many :questions 

Question.rb

has_many :answers 

所以我什麼都能做測驗模型(或任何我會打電話它)從?這發生在我

一個想法是做一個Quiz.rb模型,做

has_many :questions 

這意味着Question.rb屬於兩個User.rb和Quiz.rb.

然後我可以如上所述使用用戶,測驗和分數來做has_many :through嗎?如果是這樣,分數將同時具有user_id(對於玩家)和quiz_id(對於測驗),但是由於整個關聯的目的是防止用戶玩兩次相同的測驗,所以我想知道我該如何做到這一點使用下面的代碼。

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(播放器),score.rb,quiz.rb成立,我將如何檢查,如果他們已經在這種情況下發揮這個特殊的測驗。

此外,如果我做測驗模型,並做has_many:問題,我將不得不使用多態性,因爲user.rb也has_many:問題?

更新:我想檢查他們是否已經在def startGame方法中玩過,並且不讓他們繼續遊戲,如果他們有。即我不想等到要保存分數以查看該測驗的分數是否已經保存。

回答

2

你的代碼已經很好看了。如果您想阻止任何玩家多次玩測驗,您可以將用戶和測驗的任意組合都設爲唯一。你的建議

validates_uniqueness_of :user_id, scope: quiz_id 
+0

謝謝,但這是否意味着你做的一切是一樣的:你可以添加到您的分數遷移:

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

並添加到您的分數模型。所以你會做Quiz.rb has_many:問題? User.rb has_many:問題是否重要?我必須使用多態嗎?測驗和用戶都有has_many:問題嗎?「原樣」嗎? – BrainLikeADullPencil 2013-03-15 04:51:15

+1

你的答案似乎假設我們在再次玩牌後做了唯一性檢查(如果他們已經玩過一次,估計不會讓他們保存)。但是,我想檢查startGame方法並阻止它們再次播放。 – BrainLikeADullPencil 2013-03-15 04:54:39

+0

@BrainLikeADullPencil:你可以檢查'quizzes'來查看測驗是否存在,如果你找到它,就會抱怨。 – 2013-03-15 19:56:25