125

以下を考えると

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

おそらく当然のことながら、ファクトリがお互いを再帰的に使用して自分自身を定義するため、無限ループが発生します。

さらに驚くべきことに、これを行う方法についての言及がどこにも見つかりませんでした。必要なファクトリを定義するためのパターンはありますか、それとも根本的に間違ったことをしていますか?

4

11 に答える 11

135

これが私のために働く解決策です。

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

これが誰かに役立つことを願っています。

于 2012-04-18T15:07:24.567 に答える
40

Factorygirl はその後更新され、この問題を解決するためのコールバックが含まれるようになりました。詳細については、http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girlをご覧ください。

于 2010-01-16T03:19:32.077 に答える
22

私の意見では、次のような 2 つの異なるファクトリを作成するだけです。

Factory.define :user, :class => ユーザー do |u|
  # 通常の属性初期化のみ
 終わり

 Factory.define :company, :class => Company do |u|
  # 通常の属性初期化のみ
 終わり

ユーザーのテストケースを書くときは、このように書くだけです

工場(:ユーザー, :会社 => [工場(:会社)])

それがうまくいくことを願っています。

于 2011-03-03T12:03:33.430 に答える
5

私にとってうまくいったのは、ファクトリを使用するときに関連付けを設定することでした。あなたの例を使用して:

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

company.users << user 
company.save! 
于 2010-03-03T22:58:46.197 に答える
4

このようにすてきで冗長であることがわかりました:

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

  factory :bar do
    name "Bar"
    foos { |a| [a.association(:foo)] }
  end
end
于 2017-02-14T10:12:34.877 に答える
3
  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

警告:ユーザーを変更: [user] to :users => [user] for ruby​​ 1.8.x

于 2012-04-02T15:16:17.943 に答える
0

まず最初に、habtm の代わりに has_many :through を使用することを強くお勧めします (詳細はこちら)。最終的には次のようになります。

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

于 2009-09-28T08:30:07.157 に答える
-1

新しいファクトリを定義し、 after(:create) コールバックを使用して関連付けのリストを作成できます。この例でそれを行う方法を見てみましょう。

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

属性 company_count は一時的なものであり、ファクトリの属性およびエバリュエーターを介したコールバックで使用できます。これで、必要な会社の数を指定するオプションを使用して、会社を持つユーザーを作成できます。

create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15
于 2018-03-14T12:59:15.497 に答える