ここの問題リストに戻らなければならないのは残念ですが、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つは、投稿を因数分解したときにbuild
とcreate
どちらに電話したかわからないことですが、これにより常にコメントが作成されます。 そこで、構文を少し試して、代わりにassociation
をそこに入れて、これを思いつきました。
factory :post do
title 'This is a Post'
comments { [association(:comment)] }
end
それは正しい方法ですか? GETTING_STARTED
は、この1つのケースを除いて、FGで実行できるほぼすべての情報が記載されています。 ありがとう!
ちなみに、後の方法が正しい場合は、自分でドキュメントを更新してプルリクエストを発行していただければ幸いです。
+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ドキュメントにあります。
構文の改善とこれをより簡単にする方法について説明することは有益ですが、実装の開始時に別のプルリクエストで処理する方が適切だと思います。 今のところ、これはドキュメントに焦点を当てており、このコミットはその要求を処理する必要があります。
ディスカッションに貢献してくれた皆さんに感謝します!
最も参考になるコメント
has_many
アソシエーションのレコードを作成することは、いくつかの理由から、ちょっと注意が必要です。まず、リレーショナルデータベースでこれを行うには、鶏が先か卵が先かという問題が常にあります。これは、一方のレコードがもう一方のレコードの前に存在する必要があるためです。 別々のテーブルに同時にレコードを作成することはできず、一方のテーブルが他方の主キーを保持する必要があります。
次に、問題のモデルでどのような種類の検証またはコールバックが実行されているかがわからないため、コレクションを保存する必要があるのか、保存しない必要があるのかを判断するのは困難です。
少なくともメンバーがコレクションに存在することを検証している場合は、保存されていないレコードのリストを渡してみることができます(
Factory.build
)。コレクションについて何も検証していない場合は、after_createコールバックで検証することをお勧めします。