2017-10-15 27 views
0

我試圖讓在Rails網上問答系統5.Rails的多對多IDS

這裏有一些機型:

quizquestionquiz_questionanswercategory

questions (:title, :category_id, type_id)

answers (:title, :is_right)

quizzes (:title, :category_id, question_count, question_ids)

的關聯是:

class Quiz < ApplicationRecord 
    has_many :questions, :through => :quiz_questions 
    belongs_to :category 
end 




class QuizQuestion < ApplicationRecord 
    belongs_to :quiz 
    belongs_to :question 
end 



class Question < ApplicationRecord 
    has_many :answers, inverse_of: :question, :dependent => :destroy 
    accepts_nested_attributes_for :answers, allow_destroy: true, reject_if: :all_blank 

    belongs_to :category 
    belongs_to :type 
    has_many :quizzes, :through => :quiz_questions 
end 

產生一個新的測驗時,我們得到的是提問的類別,問題的集合。

的問題的數量也許所有的類別,或只是其中的一部分,如100或200

這裏是我的問題:

  1. 如果有必要創建QuizQuestion模式建立many-to-many關聯?

  2. 我想使用question_ids,quizzes這一列來存儲測驗從問題表中按類別得到的問題。 但是有太多的問題,無法選擇所需的問題。如何實現這一點?

回答

0

您將要採取的Active Record Associations Guide仔細一看,特別是在has_many :through relationships部分。

  1. 您不一定需要QuizQuestion模型,但您可能需要一個模型。另一種方法是在數據庫中創建一個連接表,並使用has_and_belongs_to_many關係而不是has_many :through關係。但是,has_many :through具有一些優點;最重要的是,它允許您將列添加到關聯模型中。例如,在這種情況下,您可能會意識到,您希望在QuizQuestion模型中添加一個position字段,以允許特定的測驗問題排序 - 您無法將其添加爲has_and_belongs_to_many

  2. 實際上,您的測驗模型中不需要question_idsquestion_count屬性。你has_many :through關係可以讓你做這樣的事情:

    quiz.questions << a_question # add a question to the quiz 
    quiz.questions -= a_question # remove a question from the quiz 
    quiz.questions.count 
    quiz.questions.ids 
    

    那些過去兩年,特別是使得不需要要麼這些屬性對你的測驗模型 - 它會自動採取爲你照顧。

+0

謝謝您的回覆。有很多有價值的觀點。正如你所說,我仍然使用'has_many:through'。我遇到了另一個問題:當使用'quiz.questions'時,有許多SQL查詢像'SELECT COUNT(*)FROM「questions」INNER JOIN「quiz_questions」ON ...'。計數' – floox

+0

你在循環內使用它嗎?因爲每次調用'quiz.questions.count'時,rails應該只會生成一個查詢... – drosboro