次のモンゴイドドキュメントがあるとします。
class User
include Mongoid::Document
embeds_one :name
end
class UserName
include Mongoid::Document
field :first
field :last_initial
embedded_in :user
end
埋め込まれた名と最後のイニシャルを初期化するファクトリーガールファクトリーをどのように作成しますか?また、embeds_many
の関係でどのようにそれを行いますか?
私もこれを探していました。調査しているときに、たくさんのコードに出くわし、それらをすべてつなぎ合わせました(ただし、より良いドキュメントがあればいいのですが)が、ここにコードの一部があります。アドレスは1..1の関係であり、電話はイベントとの1..nの関係です。
factory :event do
title 'Example Event'
address { FactoryGirl.build(:address) }
phones { [FactoryGirl.build(:phone1), FactoryGirl.build(:phone2)] }
end
factory :address do
place 'foobar tower'
street 'foobar st.'
city 'foobar city'
end
factory :phone1, :class => :phone do
code '432'
number '1234567890'
end
factory :phone2, :class => :phone do
code '432'
number '0987654321'
end
(そして、リンクを提供できない場合は申し訳ありませんが、それらはちょっとめちゃくちゃでした)
埋め込みオブジェクトの数を動的に定義できるソリューションは次のとおりです。
_FactoryGirl.define do
factory :profile do
name 'John Doe'
email '[email protected]'
user
factory :profile_with_notes do
ignore do
notes_count 2
end
after(:build) do |profile, evaluator|
evaluator.notes_count.times do
profile.notes.build(FactoryGirl.attributes_for(:note))
end
end
end
end
end
_
これにより、FactoryGirl.create(:profile_with_notes)
を呼び出して2つの埋め込みメモを取得するか、FactoryGirl.create(:profile_with_notes, notes_count: 5)
を呼び出して5つの埋め込みメモを取得できます。