FactoryGirl令人困惑:has_many到

时间:2016-11-29 17:07:12

标签: ruby-on-rails rspec factory-bot

我很难弄清楚这个错误究竟意味着什么:

    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)  

这些是工厂:

    # 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

我的猜测是,Quiz工厂中的关联旁边的nil与错误有关。我试图阅读FactoryGirl文档,看看如何创建正确的关联,但我不明白某些事情。例如:

  • 我应该只在工厂中为联接表(问题)创建关联吗?

  • 更重要的是,既然我想首先创建一个问题,然后告诉问题它有哪些选项,我该如何在工厂实现这个目标?

谢谢!

编辑:

期权模型:

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

问题模型

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

测验模型

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

2 个答案:

答案 0 :(得分:0)

我认为您需要在关系中添加class_name选项,我很确定Rails并不像您期望的那样处理Some命名空间。 例如: class Some::QuizQuestion < ApplicationRecord belongs_to :some_questions, class_name: 'Some::Question' belongs_to :some_questions, through: :some_quiz_questions end 此外,第二个belongs_to没有任何意义,您在定义它之后立即重新定义some_questions

答案 1 :(得分:0)

忘记发布此问题的解决方案。

主要问题/问题是:

  • 为什么连接表的验证失败/返回错误如下:

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

我怀疑,这是因为QuizQuestion工厂中两个关联旁边的nil值:

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

解决方案是摆脱nil值。