2011-09-24 80 views
34

工厂女孩+ Mongoid嵌入文档比方说,你有以下mongoid文件:在灯具

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关系?

回答

62

我也在寻找这个,因为我在研究我偶然发现了很多代码,并将它们拼凑在一起(我希望这里有更好的文档),但这是我的代码的一部分。地址是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 

(很遗憾,如果我不能提供我的链接,他们还挺搞砸)

+0

感谢您的支持。我只是浪费时间来追踪这个问题。 –

+1

请注意,phones属性是一个数组(FactoryGirl调用被[]包围)。你不需要多于一个:手机,但它必须是一个数组,如果关系是一个embeds_many。那个细节花了我大约4个小时! – SteveO7

5

这里是一个解决方案,允许您动态定义嵌入对象的数量:

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)并获得两个嵌入笔记,或拨打FactoryGirl.create(:profile_with_notes, notes_count: 5)并获得五个嵌入笔记。