web-dev-qa-db-ja.com

Rails)で関連付けの問題が見つかりませんでした

私はRailsのRubyにかなり慣れておらず、明らかにアクティブレコードの関連付けの問題がありますが、自分で解決することはできません。

3つのモデルクラスとそれらの関連付けを考えると:

# application_form.rb
class ApplicationForm < ActiveRecord::Base
  has_many :questions, :through => :form_questions
end

# question.rb
class Question < ActiveRecord::Base
  belongs_to :section
  has_many :application_forms, :through => :form_questions
end

# form_question.rb
class FormQuestion < ActiveRecord::Base
  belongs_to :question
  belongs_to :application_form
  belongs_to :question_type
  has_many :answers, :through => :form_question_answers
end

しかし、コントローラーを実行してアプリケーションフォームに質問を追加すると、次のエラーが発生します。

ActiveRecord::HasManyThroughAssociationNotFoundError in Application_forms#show

Showing app/views/application_forms/show.html.erb where line #9 raised:

Could not find the association :form_questions in model ApplicationForm

誰かが私が間違っていることを指摘できますか?

35
Ash

ApplicationFormクラスでは、ApplicationFormsと 'form_questions'の関係を指定する必要があります。それについてはまだ知りません。どこでも:through、最初にそのレコードを見つける場所を指示する必要があります。他のクラスでも同じ問題があります。

そう

# application_form.rb
class ApplicationForm < ActiveRecord::Base
  has_many :form_questions
  has_many :questions, :through => :form_questions
end

# question.rb
class Question < ActiveRecord::Base
  belongs_to :section
  has_many :form_questions
  has_many :application_forms, :through => :form_questions
end

# form_question.rb
class FormQuestion < ActiveRecord::Base
  belongs_to :question
  belongs_to :application_form
  belongs_to :question_type
  has_many :form_questions_answers
  has_many :answers, :through => :form_question_answers
end

それはあなたがそれを設定する方法であると仮定しています。

65
Jim

あなたは含める必要があります

has_many :form_question_answers

FormQuestionモデル内。 :throughは、モデルですでに宣言されているテーブルを想定しています。

他のモデルについても同じことが言えます。最初にhas_many :throughを宣言するまで、has_manyアソシエーションを指定することはできません。

# application_form.rb
class ApplicationForm < ActiveRecord::Base
  has_many :form_questions
  has_many :questions, :through => :form_questions
end

# question.rb
class Question < ActiveRecord::Base
  belongs_to :section
  has_many :form_questions
  has_many :application_forms, :through => :form_questions
end

# form_question.rb
class FormQuestion < ActiveRecord::Base
  belongs_to :question
  belongs_to :application_form
  belongs_to :question_type
  has_many :form_question_answers
  has_many :answers, :through => :form_question_answers
end

スキーマが少し不安定なように見えますが、要点は、常に最初に結合テーブルのhas_manyを追加してから、スルーを追加する必要があるということです。

14
bensie