2009-11-23 20 views
31

Soy bastante nuevo en Ruby on Rails, y claramente tengo un problema de asociación de registros activo, pero no puedo resolverlo solo.No se pudo encontrar el problema de asociación en Rails

Dadas las tres clases del modelo con sus asociaciones:

# 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 

Pero cuando ejecuto el controlador para añadir preguntas a los formularios de solicitud, me sale el error:

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 

¿Puede alguien señalar lo Estoy haciendo mal?

Respuesta

57

En la clase ApplicationForm, debe especificar la relación de ApplicationForms con 'form_questions'. Todavía no lo sabe. Donde sea que use el :through, primero debe indicar dónde encontrar ese registro. Mismo problema con tus otras clases.

Así

# 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 

Eso está asumiendo que es como hay que configurar.

+1

lo he hecho miles de veces e incluso mirando a mis otros modelos hmt de trabajo, no pude ver que me faltaba el otro has_many ... jaja ... – Danny

11

es necesario incluir un

has_many :form_question_answers 

En su modelo FormQuestion. The: through espera una tabla que ya ha sido declarada en el modelo.

Lo mismo sucede con sus otros modelos - no se puede suministrar una asociación has_many :through hasta que se haya declarado la primera 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 

Parece que el esquema podría ser un poco flojo, pero el punto es siempre debe agregar primero el has_many para la tabla de unión, y luego agregar el pase.

+0

Muchas gracias por esto; por supuesto, tiene su respuesta. Sin embargo, "solo puede haber uno", le di la respuesta al otro simplemente porque él respondió primero. Sin embargo, voté tu respuesta, por lo que hubo al menos un premio de consolación por tener la respuesta correcta. Gracias una tonelada. :) – Ash

Cuestiones relacionadas