2016-11-29 3 views
0

Ich habe eine harte Zeit, herauszufinden, zu haben, was dieser Fehler bedeutet genau das:Verwirrung Abounds mit factory: has_many durch

An error occurred in a `before(:suite)` hook. 
    Failure/Error: FactoryGirl.lint 

    FactoryGirl::InvalidFactoryError: 
     The following factories are invalid: 

     * question - Validation failed: Option must 
     exist, Question must exist (ActiveRecord::RecordInvalid) 

Dies sind die Fabriken:

# question has many options through quiz 
    FactoryGirl.define do 
    factory :question, class: 'Question' do 
     option "What color are your eyes" 
    end 
    end 

    # option has many questions through quiz 
    FactoryGirl.define do 
     factory :option, class: 'Option' do 
     option "blue" 
     end 
    end 

    # JoinTable 
    FactoryGirl.define do 
     factory :quiz, class: 'Quiz' do 
     option nil 
     question nil 
     end 
    end 

Meine Vermutung ist, dass die nil Recht Neben den Verbänden in Quiz hat factor etwas mit dem Fehler zu tun. Ich habe versucht, die FactoryGirl-Dokumente zu lesen, um zu sehen, wie man die richtigen Assoziationen erzeugt, aber bestimmte Dinge verstehe ich nicht. Zum Beispiel:

  • soll ich die Assoziationen in der Fabrik nur für die Join-Tabelle (Frage) erstellen?

  • wichtiger, da ich zuerst eine Frage erstellen und dann die Frage stellen möchte, welche Optionen es hat, wie erreiche ich das in der Factory?

Vielen Dank!

Edit:

Option Modell:

class Option < ApplicationRecord 
     has_many :quizzes 
     has_many :questions, through: :quizzes 
    end 

Frage Modell

class Question < ApplicationRecord 
    has_many :quizzes 
    has_many :options, through: :quizzes 
    end 

Quiz Modell

class Some::QuizQuestion < ApplicationRecord 
     belongs_to :questions 
     belongs_to :options 
    end 
+1

Ich denke, Sie müssen Ihre Modelle einschließen, damit wir die Validierungen sehen können, um eine gute Antwort auf diese zu bekommen. – Brad

+0

Für Ihre zweite Frage könnten Sie Merkmale verwenden, um Fragen mit verschiedenen Optionen zu erstellen, siehe: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#traits – David

Antwort

0

Haben Sie vergessen, die Lösung für diese Frage zu veröffentlichen.

Haupt Problem/Frage:

  • warum die Validierung für die Join-Tabelle versagte/Rückkehr Fehler unter:

    * question - Validation failed: Option must 
        exist, Question must exist (ActiveRecord::RecordInvalid) 
    

Wie ich vermutete, es war wegen der nil Wert neben den beiden Assoziationen in QuizQuestion Fabrik:

FactoryGirl.define do 
    factory :quiz, class: 'Question' do 
    option nil 
    question nil 
    end 
end 

Lösung war, den Wert nil loszuwerden.

0

Ich glaube, Sie brauchen die class_name Option zu Ihrem relatio hinzufügen nships, ich bin mir ziemlich sicher, dass Rails sich nicht mit dem Namespace Some so verhält, wie Sie es erwarten. Zum Beispiel: class Some::QuizQuestion < ApplicationRecord belongs_to :some_questions, class_name: 'Some::Question' belongs_to :some_questions, through: :some_quiz_questions end Auch das zweite belongs_to macht keinen Sinn afaict, Sie definieren some_questions direkt nach der Definition neu.

+0

Das ist ein Tippfehler. Werde es jetzt korrigieren und sehen, was passiert. – Uzzar

+0

Die wirkliche Antwort war über die Option 'class_name'. Hat das bei Ihrem Problem geholfen? – Brad