给定以下

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

或许不令人吃惊,这导致在一个无限循环作为工厂递归使用彼此来定义他们自己。

更令人惊讶的我还没有找到如何做到这一点的任何地方一提的,是有确定必要的工厂或我在做某种根本性错误的模式?

有帮助吗?

解决方案 2

Factorygirl已经被更新,并且现在包括回调来解决这个问题。看看 http://robots.thoughtbot.com/post / 254496652 / AINT-NO-马蹄莲回女孩获取更多信息。

其他提示

下面是对我的作品的溶液。

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])

希望这将是有帮助的人

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

 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)])

希望它将工作。

我couldn't找到用于所提供的网站上输入的情况下的示例。 (只有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

警告:更改用户:[用户]到:用户=> [用户]为红宝石1.8.x的

找到这样好的和冗长:

FactoryGirl.define do
  factory :foo do
    name "Foo" 
  end

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

所有我强烈建议您使用的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。

更新导轨5:

而不是使用has_and_belongs_to_many关联的,你应该考虑:has_many :through协会

对于这种关联的用户工厂看起来像这样:

FactoryBot.define do
  factory :user do
    # user attributes

    factory :user_with_companies do
      transient do
        companies_count 10 # default number
      end

      after(:create) do |user, evaluator|
         create_list(:companies, evaluator.companies_count, user: user)
      end
    end
  end
end

您可以用类似的方式创建公司的工厂。

在这两个工厂都设置,您可以创建user_with_companies工厂companies_count option。在这里,您可以指定用户有多少公司属于:create(:user_with_companies, companies_count: 15)

您可以找到有关此处 工厂女孩协会详细的解释。

(:创建)

您可以定义后的新工厂,并利用回调创建关联的列表。让我们来看看如何做到这一点在这个例子:

FactoryBot.define do

  # user factory without associated companies
  factory :user do
    # user attributes

    factory :user_with_companies do
      transient do
        companies_count 10
      end

      after(:create) do |user, evaluator|
        create_list(:companies, evaluator.companies_count, user: user)
      end
    end
  end
end

属性companies_count是在工厂的属性和在经由评价者回调瞬态和可用的。现在,您可以创建企业用户与选项来指定你要多少企业:

create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15

:用于HABTM我用性状和回调

假设你有以下型号:

class Catalog < ApplicationRecord
  has_and_belongs_to_many :courses
  …
end
class Course < ApplicationRecord
  …
end

可以的限定上述工厂

FactoryBot.define do
  factory :catalog do
    description "Catalog description"
    …

    trait :with_courses do
      after :create do |catalog|
        courses = FactoryBot.create_list :course, 2

        catalog.courses << courses
        catalog.save
      end
    end
  end
end
scroll top