如何在Factory girl中创建has_and_belongs_to_many关联

ops*_*psb 119 ruby-on-rails associations has-and-belongs-to-many factory-bot

鉴于以下内容

class User < ActiveRecord::Base
  has_and_belongs_to_many :companies
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)

您如何为公司和用户定义工厂,包括双向关联?这是我的尝试

Factory.define :company do |f|
  f.users{ |users| [users.association :company]}
end

Factory.define :user do |f|
  f.companies{ |companies| [companies.association :user]}
end
Run Code Online (Sandbox Code Playgroud)

现在我试试

Factory :user
Run Code Online (Sandbox Code Playgroud)

也许不出所料,这会导致无限循环,因为工厂递归地使用彼此来定义自己.

更令人惊讶的是,我没有提到如何在任何地方做到这一点,是否有一种模式来定义必要的工厂或我做了一些从根本上错误的事情?

Sub*_*orx 130

这是适合我的解决方案.

FactoryGirl.define do

  factory :company do
    #company attributes
  end

  factory :user do
   companies {[FactoryGirl.create(:company)]}
   #user attributes
  end

end
Run Code Online (Sandbox Code Playgroud)

如果您需要特定的公司,您可以通过这种方式使用工厂

company = FactoryGirl.create(:company, #{company attributes})
user = FactoryGirl.create(:user, :companies => [company])
Run Code Online (Sandbox Code Playgroud)

希望这对某人有所帮助.

  • 谢谢,最简洁的解决方案. (4认同)

ops*_*psb 40

Factorygirl已经更新,现在包括回调来解决这个问题.有关详细信息,请查看http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl.

  • 该链接实际上没有说明如何处理has_and_belongs_to_many ...我不知道如何做到这一点...... (37认同)
  • 回调语法现在已经改为:在工厂女孩的`after(:create)`而不是`after_create`,如下所述:http://stackoverflow.com/questions/15003968/undefined-method-after-create-with-factorygirl (3认同)

Ash*_*ish 22

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

 Factory.define :user, :class => User do |u|
  # Just normal attributes initialization
 end

 Factory.define :company, :class => Company do |u|
  # Just normal attributes initialization
 end

当您为用户编写测试用例时,就这样写

 Factory(:user, :companies => [Factory(:company)])

希望它会奏效.

  • 谢谢这是我可以开展工作的唯一例子.工厂女孩是habtm的头疼. (2认同)

aur*_*bee 9

我在提供的网站上找不到上述案例的例子.(只有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
Run Code Online (Sandbox Code Playgroud)

  • 如果有非零用户数的验证怎么办? (3认同)

小智 5

对我来说有用的是在使用工厂时设置关联.使用你的例子:

user = Factory(:user)
company = Factory(:company)

company.users << user 
company.save! 
Run Code Online (Sandbox Code Playgroud)