2016-12-30 44 views
1

我有HABTM協會Rails的factory_girls和驗證問題

我的模型

class Ssr < ActiveRecord::Base 
    has_and_belongs_to_many :ssr_groups 
    validates :ssr_groups, presence: true 
end 

class SsrGroup < ActiveRecord::Base 
    has_and_belongs_to_many :ssrs, dependent: :destroy 
    validates :name, presence: true 
end 

我的工廠

FactoryGirl.define do 
    factory :ssr do 
    type 'type' 
    ssr_groups 
    end 
end 

FactoryGirl.define do 
    factory :ssr_group, class: 'SsrGroup', aliases: [:ssr_groups] do 
    name { SecureRandom.hex } 
    end 
end 

我的問題是,當我想創建FactoryGirl.create(:ssr)

我有NoMethodError: undefined method each for #<SsrGroup:0x007fbfdf792100>

爲什麼會發生?

回答

1

問題是你的ssr工廠預計收集ssr_group,你正在做的只是得到一個。這就是爲什麼錯誤,因爲它試圖對創建的ssr_group進行foreach。

爲了解決這個問題,你可以做這樣的事情:

FactoryGirl.define do 
    factory :ssr do 
    type 'type' 
    after(:create) do |ssr, evaluator| 
     create_list(:ssr_group, 1, ssrs: [ssr]) 
    end 
    end 
end 

可以使用build戰略,而不是create如果首選。

編輯:

您可以提高工廠一點點,像這樣:

FactoryGirl.define do 
    factory :ssr do 
    type 'type' 

    factory :ssr_with_groups do 
     transient do 
     groups_count 5 # Default count of ssr_groups it will create 
     end 

     after(:create) do |ssr, evaluator| 
     create_list(:ssr_group, evaluator.groups_count, ssrs: [ssr]) 
     end 
    end 
    end 
end 

這樣一來,它更靈活,你可以使用它像這樣:

create(:ssr_with_groups, groups_count: 10) 

它會創建一個具有10個ssr_groups的ssr。

編輯2:

鑑於您對相關聯的存在驗證,則需要保存對象之前添加的關聯,所以使用構造策略,而不是像這樣:

FactoryGirl.define do 
    factory :ssr do 
    type 'type' 
    after(:build) do |ssr, evaluator| 
     ssr.ssr_groups << build_list(:ssr_group, 1, ssrs: [ssr]) 
    end 
    end 
end 

您可以深入瞭解文檔:http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Associations

+0

我已經嘗試了您的解決方案,現在我已經得到了'ActiveRecord :: RecordInvalid:驗證失敗:Ssr組不能爲空 ' – user

+0

你是對的,我錯過了存在驗證,看到我的編輯2。 –