2011-09-24 18 views
34

diciamo di avere i seguenti documenti: mongoiddocumenti Factory Girl + Mongoid incorporati in apparecchi

class User 
    include Mongoid::Document 
    embeds_one :name 
end 

class UserName 
    include Mongoid::Document 
    field :first 
    field :last_initial 

    embedded_in :user 
end 

Come si fa a creare una fabbrica ragazza fabbrica che inizializza il primo nome incorporato e l'iniziale del cognome? Inoltre, come lo faresti con una relazione embeds_many?

risposta

62

Anche io stavo cercando questo e mentre stavo facendo ricerche ho inciampato in un sacco di codice e li ho messi insieme tutti insieme (vorrei che ci fossero documenti migliori) ma qui c'è la mia parte del codice. L'indirizzo è una relazione 1..1 e Phones è una relazione 1..n agli eventi.

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 

(E scusate se non posso fornire i miei link, sono stati un pò incasinato)

+0

Grazie per questo. Ho solo perso ore a rintracciare questo problema. –

+1

Si noti che l'attributo phone è un array (le chiamate FactoryGirl sono circondate da []). Non hai bisogno di più di uno: il telefono, ma deve essere un array se la relazione è un embed_many. Quel dettaglio mi è costato circa 4 ore! – SteveO7

5

Ecco una soluzione che permette di definire dinamicamente il numero di oggetti incorporati:

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 

Ciò consente di chiamare FactoryGirl.create(:profile_with_notes) e ottenere due note incorporate o chiamare FactoryGirl.create(:profile_with_notes, notes_count: 5) e ottenere cinque note incorporate.

Problemi correlati