[ruby-on-rails] Factory Girl에서 has_and_belongs_to_many 연결을 만드는 방법
다음을 감안할 때
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
양방향 연관을 포함하여 기업과 사용자를위한 공장을 어떻게 정의합니까? 여기 내 시도
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
이제 나는 시도
Factory :user
당연히 공장이 서로를 재귀 적으로 사용하여 자신을 정의하기 때문에 무한 루프가 발생합니다.
더 놀랍게도 나는 이것을 어디에서나 수행하는 방법에 대한 언급을 찾지 못했습니다. 필요한 공장을 정의하는 패턴이 있습니까? 아니면 근본적으로 잘못하고 있습니까?
답변
여기 저에게 맞는 솔루션이 있습니다.
FactoryGirl.define do
factory :company do
#company attributes
end
factory :user do
companies {[FactoryGirl.create(:company)]}
#user attributes
end
end
특정 회사가 필요하면 이런 식으로 공장을 사용할 수 있습니다.
company = FactoryGirl.create(:company, #{company attributes})
user = FactoryGirl.create(:user, :companies => [company])
이것이 누군가에게 도움이되기를 바랍니다.
답변
Factorygirl은 이후 업데이트되었으며 이제이 문제를 해결하기위한 콜백을 포함합니다. 자세한 내용 은 http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl 을 참조하십시오.
답변
제 생각에는 다음과 같이 두 개의 다른 공장을 만드십시오.
Factory.define : user, : class => User do | u | # 그냥 일반적인 속성 초기화 종료 Factory.define : company, : class => Company do | u | # 그냥 일반적인 속성 초기화 종료
사용자에 대한 테스트 케이스를 작성할 때 다음과 같이 작성하십시오.
Factory (: 사용자, : companies => [Factory (: company)])
그것이 효과가 있기를 바랍니다.
답변
제공된 웹 사이트에서 위에 언급 된 사례에 대한 예를 찾을 수 없습니다. (1 : N 및 다형성 조합 만, habtm 없음). 비슷한 경우가 있었고 코드는 다음과 같습니다.
Factory.define :user do |user|
user.name "Foo Bar"
user.after_create { |u| Factory(:company, :users => [u]) }
end
Factory.define :company do |c|
c.name "Acme"
end
답변
나를 위해 일한 것은 공장을 사용할 때 협회를 설정하는 것이 었습니다. 귀하의 예를 사용하여 :
user = Factory(:user)
company = Factory(:company)
company.users << user
company.save!
답변
이 방법이 멋지고 장황하다는 것을 알았습니다.
FactoryGirl.define do
factory :foo do
name "Foo"
end
factory :bar do
name "Bar"
foos { |a| [a.association(:foo)] }
end
end
답변
factory :company_with_users, parent: :company do
ignore do
users_count 20
end
after_create do |company, evaluator|
FactoryGirl.create_list(:user, evaluator.users_count, users: [user])
end
end
경고 : 루비 1.8.x의 경우 사용자 : [user]를 : users => [user]로 변경하십시오.