Factory_bot: has_manyアソシエーションを作成するためのドキュメント

作成日 2011年09月19日  ·  5コメント  ·  ソース: thoughtbot/factory_bot

ここの問題リストに戻らなければならないのは残念ですが、FG 2.0でhas_many関係を作成するためのドキュメントを一生見つけることができません。 いくつかの実験の後、私は以下の解決策を見つけましたが、これがそれを行うための「正しい」方法であるかどうかはわかりません。

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

FactoryGirl.define do
  factory :comment do
    body 'This is a comment'
  end

  factory :post do
    title 'This is a Post'
    comments { FactoryGirl.create_list(:comment, 2) }
    # or, to create only one =>  comments { [FactoryGirl.create(:comment)] }
  end
end

Factory.create :post

問題の1つは、投稿を因数分解したときにbuildcreateどちらに電話したかわからないことですが、これにより常にコメントが作成されます。 そこで、構文を少し試して、代わりにassociationをそこに入れて、これを思いつきました。

  factory :post do
    title 'This is a Post'
    comments { [association(:comment)] }
  end

それは正しい方法ですか? GETTING_STARTEDは、この1つのケースを除いて、FGで実行できるほぼすべての情報が記載されています。 ありがとう!

最も参考になるコメント

has_manyアソシエーションのレコードを作成することは、いくつかの理由から、ちょっと注意が必要です。

まず、リレーショナルデータベースでこれを行うには、鶏が先か卵が先かという問題が常にあります。これは、一方のレコードがもう一方のレコードの前に存在する必要があるためです。 別々のテーブルに同時にレコードを作成することはできず、一方のテーブルが他方の主キーを保持する必要があります。

次に、問題のモデルでどのような種類の検証またはコールバックが実行されているかがわからないため、コレクションを保存する必要があるのか​​、保存しない必要があるのか​​を判断するのは困難です。

少なくともメンバーがコレクションに存在することを検証している場合は、保存されていないレコードのリストを渡してみることができます( Factory.build )。

コレクションについて何も検証していない場合は、after_createコールバックで検証することをお勧めします。

全てのコメント5件

ちなみに、後の方法が正しい場合は、自分でドキュメントを更新してプルリクエストを発行していただければ幸いです。

+1このようなものが必要です

has_manyアソシエーションのレコードを作成することは、いくつかの理由から、ちょっと注意が必要です。

まず、リレーショナルデータベースでこれを行うには、鶏が先か卵が先かという問題が常にあります。これは、一方のレコードがもう一方のレコードの前に存在する必要があるためです。 別々のテーブルに同時にレコードを作成することはできず、一方のテーブルが他方の主キーを保持する必要があります。

次に、問題のモデルでどのような種類の検証またはコールバックが実行されているかがわからないため、コレクションを保存する必要があるのか​​、保存しない必要があるのか​​を判断するのは困難です。

少なくともメンバーがコレクションに存在することを検証している場合は、保存されていないレコードのリストを渡してみることができます( Factory.build )。

コレクションについて何も検証していない場合は、after_createコールバックで検証することをお勧めします。

これについて@jferrisと話し合った後、理想的な構文は次のようになります。

FactoryGirl.define do
  factory :user, :aliases => [:author]

  factory :comment do
    author
    post

    factory :old_comment do
      created_at { 1.year.ago }
    end
  end

  factory :post do
    factory :commented_post do
      comments(2) # this would create two `:comment`s
      # alternatively...
      comments # this would create one `:comment`
      old_comments(2, :body => 'something static') # this would create two `:comment`s, both with body of 'something static'
      old_comments # this would create one `:old_comment`
    end
  end
end

このコミットにさらにドキュメントを追加しました: https

テストが含まれていますが(ドキュメントの優れた形式であるため)、主な例はGETTING_STARTEDドキュメントにあります。

構文の改善とこれをより簡単にする方法について説明することは有益ですが、実装の開始時に別のプルリクエストで処理する方が適切だと思います。 今のところ、これはドキュメントに焦点を当てており、このコミットはその要求を処理する必要があります。

ディスカッションに貢献してくれた皆さんに感謝します!

このページは役に立ちましたか?
0 / 5 - 0 評価