0

この問題について多くの検索を行い、かなりの数のチュートリアル (例: railscast: ネストされたモデル フォーム) を見ましたが、私の問題に対する適切な解決策ではないのではないかと心配しています。

理論のためにデータを収集したい。この理論には、独特のカードで答えなければならない多くの質問があります。私は常に (すべてのカードの) すべての質問を表示したいと考えていますが、答えは各カードによって異なる場合があります。そのため、question_id と card_id をキャッチする必要がありますが、深くネストして ID を params でキャッチするのは非常に面倒です。私の問題に対するより良い解決策を知っている人はいますか?

ここに私のモデルがあります:

理論.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

ご協力ありがとうございました!

4

1 に答える 1

0

モデル間の関係は、画面上での表示方法によって決定されるべきではありません。それらは、実際に相互にどのように関連しているかによって判断する必要があります。

理論/カードが何を表しているのか完全には理解していないので、どのような関係が必要かはわかりませんが、突き刺すことはできます:

カードは、特定の理論に関連する 1 人の人物の答えを表しているように思えます。もしそうなら、カードには答えしかないので、「has_many :questions」は必要ありません。また、各回答は質問にリンクしているため、回答から質問に「到達」できます。カードの質問のリストが本当に必要な場合は、「has_many :questions, :through=>:answers」を Card モデルに追加できます。

回答が完了する前に各カードに異なる質問セットを追加できる場合は、「has_many :questions」が必要になりますが、すべての質問が各カードにある場合は必要ありません。

以下のコメントに応じて更新します。

1 つの方法は、カードに回答を追加することです。

@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|
   -@card.answers.each 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

これはネストされたフォーム属性を使用しているため、Card モデルで動作させるには、これを追加する必要があります。

class Card < ActiveRecord::Base
  ..
  accepts_nested_attributes_for :answers
  ..
end
于 2013-02-12T13:04:46.467 に答える