2009-06-26 9 views
8

docs La chica de la fábrica ofrecen esta sintaxis para crear (supongo) las asociaciones de padres e hijos ...¿Cómo puedo definir varios objetos asociados usando Factory Girl?

Factory.define :post do |p| 
    p.author {|a| a.association(:user) } 
    end 

Un post pertenece a un usuario (su "autor").

¿Qué sucede si quiere definir una fábrica para crear User s, que tienen un montón de Post s?

¿O qué pasa si se trata de una situación de muchos a muchos (consulte la actualización a continuación, por ejemplo)?


ACTUALIZACIÓN

pensé que había descubierto. He intentado esto ...

Factory.define(:user) do |f| 
    f.username { Factory.next(:username) } 

    # ... 

    f.roles { |user| 
    [ 
     Factory(:role), 
     Factory(:role, {:name => 'EDIT_STAFF_DATA'}) 
    ] 
    } 
end 

parecía funcionar al principio, pero luego me los errores de validación porque F.G. estaba tratando de salvar al usuario dos veces con el mismo nombre de usuario y correo electrónico.

Así que vuelvo a mi pregunta original. Si tiene una relación de muchos a muchos, como por ejemplo Users y Roles, ¿cómo puede definir una Fábrica que devolverá Users con algún Roles asociado? Tenga en cuenta que Roles debe ser único, por lo que no puedo tener F.G. creando un nuevo "ADMINISTRADOR" Role en la base de datos cada vez que crea un User.

Respuesta

5

No estoy seguro de si esta es la forma más correcta de hacerlo, pero funciona.

Factory.define(:user) do |u| 
    u.login 'my_login' 
    u.password 'test' 
    u.password_confirmation 'test' 
    u.roles {|user| [user.association(:admin_role), 
         user.association(:owner_role, :authorizable_type => 'User', :authorizable_id => u.id) ]} 
end 
1

Un reciente update to factory girl permite a las asociaciones que se especificarán con bloques de devolución de llamada

1

He creado una active_factory plugin, que se ocupa de su situación en la especificación de la siguiente manera:

models { user - posts(3) } 

Si hay un interés, puedo intentar crear integración con las fábricas factory_girl.

Cuestiones relacionadas