如何在Factory Girl中创buildhas_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 

也许毫不奇怪的是,当工厂recursion地使用彼此来定义自己时,这导致无限循环。

更令人惊讶的是,我还没有发现如何在任何地方做到这一点,有没有一种模式来定义必要的工厂,或者我正在做一些根本性的错误?

这是适合我的解决scheme。

 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已经更新,现在包括callback来解决这个问题。 看看http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl了解更多信息。;

在我看来,只需创build两个不同的工厂,如:

  Factory.define:user,:class => User do | u |
   #只是正常的属性初始化
 结束

  Factory.define:company,:class => Company do | u |
   #只是正常的属性初始化
 结束

当你为用户编写testing用例时,就像这样写

 工厂(:用户,:公司=> [工厂(:公司)])

希望它能工作。

我无法在提供的网站上find上述案例的例子。 (只有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! 
  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 

警告:对于ruby 1.8.x,将用户:[user]更改为:users => [user]

首先,我强烈build议你使用has_many:而不是habtm(更多关于这个),所以你最终会得到如下结果:

 Employment belongs_to :users Employment belongs_to :companies User has_many :employments User has_many :companies, :through => :employments Company has_many :employments Company has_many :users, :through => :employments 

在此之后,你将有has_many协会在双方,并可以在你的方式在factory_girl分配给他们。

发现这种方式很好,详细:

 FactoryGirl.define do factory :foo do name "Foo" end factory :bar do name "Bar" foos { |a| [a.association(:foo)] } end end