質問

次のように考えると、

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および多形assocations、ない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
代わりにHABTMの(この詳細については、<のhref = "http://blog.hasmanythrough.com/2006/4/20/many-to-many-danceて:私は強くにhas_manyを使用することをお勧めしますすべての

まず、あなたのようなものになってしまいます-off」のrel = "nofollowをnoreferrer">ここの)、よう:

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でそれらに割り当てることができます。

Railsの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_companiescompanies_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