2016-04-22 98 views
0

我在Rails中創建了一個測驗,我在我的關聯上畫了一個空白。ActiveRecord many_to_many關聯混淆

我說我有三張桌子,我知道會在那裏。

users 
    |___id 
    |___name 

quizzes 
    |___id 
    |___user_id 

questions 
    |___id 
    |___question 
    |___poss_answer_one 
    |___poss_answer_two 
    |___poss_answer_three 
    |___answer 
    |___test_version 

這就是我開始的。該網站的功能如下:

用戶可以選擇最多三個類別的問題添加到他們的活動測驗(測驗)。因此,用戶一次只能進行一次測驗,因爲當他們完成或重新啓動新測驗時,將重新創建進入測驗表的條目。

因此,用戶has_one測驗並quizzes belongs_to用戶。

接下來,我假設一個測驗has_many的問題,因爲問題是可重用的,可以包含在許多不同的測驗,它會需要一個連接表嗎?

如果這樣會

quiz_questions 
    |___id 
    |___question_id 
    |___quiz_id 

在這種情況下,將通過需要的has_many。

一旦我完成了這個工作,我知道如何建立關聯模型,我只是因爲措辭而迷惑自己。

回答

1

也許你需要一個HABTM協會(見本RailsCasts

class Quiz < ActiveRecord::Base 
    has_and_belongs_to_many :questions 
end 
+0

這是我的理解,這是不贊成,應該與HMT協會完成。我只是想確保我對什麼屬於什麼是正確的理解。我理解它們之間的差異,但如果它是嚴格的連接表,則使用HABTM。 –

+0

您的案例中的HABTM默認使用quizzes_questions表。它似乎並不被棄用。請參閱[API文檔](http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many) –

+0

好的,感謝您的信息,看起來像我在正確的道路上,只是簡單地迷惑了我自己。 –

0

有許多有效的方法(我認爲)。通過您的has_many through建議,以下內容可以發揮作用。 (雖然HATBM肯定會更容易實施,並且對大多數使用情況也有效)。

class Question < ActiveRecord::Base 
    belongs_to :category 
    has_many :quiz_questions 
    has_many :quizzes, through: :quiz_questions 

class QuizQuestion < ActiveRecord::Base 
    belongs_to :quiz 
    belongs_to :question 

class Quiz < ActiveRecord::Base 
    belongs_to :user 
    has_many :quiz_questions, dependent: :destroy 
    has_many :questions, through: :quiz_questions 

您寫道:

一個用戶一次只能有一個測驗,因爲當他們完成或 重新開始一個新的,進入測驗表將 重-created。

我會說,即使是這種情況,你仍然需要一個has_many關係。您不會在測驗表中重新創建記錄。你將創造一個新的紀錄。作爲單獨的一項功能,如果這些「舊」記錄完全不再需要,您可以決定刪除該測試表中屬於該特定用戶的(任何)現有記錄。

0

用戶可以具有零個,一個或許多測驗(不只是一個),所以關聯應該是一個has_many關聯不僅僅是has_one關聯,爲澄清

  • 用戶具有一個測驗:user.quiz
  • 用戶有許多小測驗:user.quizees
  • 測驗屬於用戶:quiz.user

雖然用戶一次只能進行一次測驗,但在用戶完成測驗後,用戶可以進行另一次新的測驗。

  • USER1 - > quiz1
  • USER1 - > quiz2
  • USER1 - > quiz3

many-to-many關聯,您可以使用has_and_belongs_to_many(如果你不需要額外的列表,除了quiz_id和question_id)或引入連接表