2013-02-12 83 views
0

我對這個問題進行了大量搜索,並觀看了很多教程(例如railscast:嵌套模型表單),但恐怕這不是我的問題的正確解決方案。如何在沒有嵌套的情況下連接表單中的模型?

我想收集理論數據。這個理論有很多問題需要在獨特的卡片上得到解答。我總是希望顯示所有問題(在所有卡片上),但答案可能會有所不同,具體取決於每張卡片。因此,我需要抓住question_id和card_id,但深層嵌套並通過params捕捉id會非常痛苦。有誰知道我的問題更好的解決方案?

這裏是我的模型:

theory.rb

class Theory < ActiveRecord::Base 

has_many :cards 
has_many :questions 

card.rb

class Card < ActiveRecord::Base 

belongs_to :theory 
has_many :answers 
has_many :questions (Do I need this here - I always want to display all questions?) 

question.rb

class Question < ActiveRecord::Base 

belongs_to :theory 
has_many :answers 

answer.rb

class Answer < ActiveRecord::Base 

belongs_to :card 
belongs_to :question 

謝謝你很多關於你的幫助!

回答

0

您的模型之間的關係不應該由他們如何顯示在屏幕上決定。他們應該由他們如何實際上彼此相關來決定。

我不完全理解應該代表,所以我不能告訴你什麼關係,需要有哪些理論/卡,但我可以在有刺吧:

在我看來,作爲雖然卡片代表了一個人與特定理論相關的答案。如果是這樣,那麼你不需要「has_many:questions」,因爲該卡只有答案。此外,每個答案都鏈接到一個問題,以便您通過答案「獲得」問題。如果你真的想要一張卡片的問題列表,你可以在卡片模型中添加一個「has_many:questions,:through =>:answers」。

如果每張卡片在完成任何回答之前都可以添加一組不同的問題,那麼您將需要「has_many:questions」,但是如果所有問題都在每張卡片上,那麼您將不需要它。

更新響應下方的評論:

一種方式是通過在控制器中建立起來添加答案卡:

@card = Card.find 2 
@theory = Theory.find 1 

@theory.questions.each do |question| 
    @card.answers.build :question=>question 
end 

然後在您的視圖做這樣的事情(這是HAML):

= form_for @card do |f| 
    [email protected] do |answer| 
    =f.fields_for answer do |answer_form| 
     =answer_form.hidden_field :question_id 
     %p=answer.question.full_question 
     %p=answer_form.text_field :input 

這是使用嵌套表格屬性,所以要讓它與你的顯卡型號工作,你就必須把它添加到它:

class Card < ActiveRecord::Base 
    .. 
    accepts_nested_attributes_for :answers 
    .. 
end 
+0

感謝您的幫助。 – 2013-02-13 15:34:14

+0

我知道這聽起來很複雜,但我想要的是卡片,都顯示相同的問題,但不同的答案。 (例如,理論是權利哲學,每張卡片都代表一位哲學家,他的個人答案也是同樣的問題。)所以一個問題通過卡片有很多答案。但是現在實際上,我怎樣才能得到我的形式中的question_id?如何將問題字段與答案輸入字段連接? – 2013-02-13 15:43:39

相關問題