2016-12-30 3 views
1

내가 가진 HABTM 협회레일 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 

대신 createbuild 전략을 사용할 수 있습니다.

편집 :

당신은 당신의 공장 조금,이 같은 향상시킬 수

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 : Validation failed : Ssr 그룹은 비워 둘 수 없습니다 ' – user

+0

맞습니다. 현재 상태 확인을 놓쳤습니다. 편집 2를 참조하십시오. –