2011-09-24 6 views
34

Digamos que usted tiene los siguientes documentos: MongoIddocumentos Fábrica de chicas + Mongoid incrustadas en accesorios

class User 
    include Mongoid::Document 
    embeds_one :name 
end 

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

    embedded_in :user 
end 

¿Cómo se crea una fábrica chica de la fábrica que inicializa el primer nombre y la inicial incrustado? ¿También cómo lo harías con una relación embeds_many?

Respuesta

62

Yo también estaba buscando esta y como estaba investigando he tropezado con un montón de código y los reconstruí todos juntos (me gustaría que hubiera mejores documentos), pero esta es mi parte del código. La dirección es una relación 1..1 y Phones es una relación 1..n con los eventos.

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 

(Y lo siento si no puedo ofrecer mis enlaces, que estaban en mal estado un poco hacia arriba)

+0

Gracias por esto. Solo perdí horas buscando este problema. –

+1

Tenga en cuenta que el atributo de teléfonos es una matriz (las llamadas FactoryGirl están rodeadas por []). No necesita más de uno: teléfono, pero tiene que ser una matriz si la relación es un embeds_many. ¡Ese detalle me costó alrededor de 4 horas! – SteveO7

5

Aquí es una solución que le permite definir dinámicamente el número de objetos incrustados:

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 

Esto le permite llamar al FactoryGirl.create(:profile_with_notes) y obtener dos notas incrustadas, o llamar al FactoryGirl.create(:profile_with_notes, notes_count: 5) y obtener cinco notas incorporadas.