2009-11-23 6 views
31

Ich bin ziemlich neu in Ruby on Rails, und ich habe eindeutig ein aktives Aufnahmeassoziationsproblem, aber ich kann es nicht allein lösen.Konnte das Verbindungsproblem in Rails nicht finden

die drei Modellklassen mit ihren Verbänden Gegeben:

# 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 

Aber wenn ich den Controller ausführen Fragen zu Antragsformulare hinzuzufügen, erhalte ich die Fehlermeldung:

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 

Kann jemand darauf hinweisen, was Ich mache falsch?

Antwort

57

In der ApplicationForm-Klasse müssen Sie die Beziehung von ApplicationForms zu 'form_questions' angeben. Es weiß es noch nicht. Überall, wo Sie die verwenden, müssen Sie zuerst angeben, wo dieser Datensatz gefunden werden soll. Dasselbe Problem mit deinen anderen Klassen.

So

# 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 

, dass dies unter der Annahme ist, wie Sie es einrichten.

+1

ich habe das schon tausendmal gemacht und selbst wenn ich meine anderen arbeitenden hmt-modelle anstarrte, konnte ich nicht sehen, dass mir der andere gefehlt hat has_many ... lol ... – Danny

11

Sie benötigen ein Modell

has_many :form_question_answers 

In Ihrem FormQuestion aufzunehmen. The: through erwartet eine Tabelle, die bereits im Modell deklariert wurde.

Das Gleiche gilt für die anderen Modelle - Sie kein has_many :through Verein liefern können, bis Sie zuerst die has_many deklariert haben

# 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 

Es sieht aus wie Ihr Schema ein bisschen wackelig sein könnte, aber der Punkt ist, Sie müssen immer zuerst die Datei has_many für die Join-Tabelle hinzufügen und dann die Durchfügung hinzufügen.

+0

Vielen Dank dafür - Sie sind natürlich genau richtig mit Ihrer Antwort. "Es kann nur einen geben", also habe ich dem anderen die Antwort gegeben, einfach weil er zuerst geantwortet hat. Ich habe deine Antwort jedoch abgelehnt, also gab es zumindest einen Trostpreis dafür, die richtige Antwort zu haben. Danke eine Tonne. :) – Ash