Dado lo siguiente
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
¿Cómo se definen las fábricas para empresas y usuarios incluida la asociación bidireccional? Este es mi intento
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
ahora lo intento
Factory :user
Quizás, como era de esperar, esto da como resultado un bucle infinito, ya que las fábricas se usan recursivamente para definirse a sí mismas.
Más sorprendentemente, no he encontrado una mención de cómo hacer esto en ninguna parte, ¿hay un patrón para definir las fábricas necesarias o estoy haciendo algo fundamentalmente mal?
Desde entonces, Factorygirl se ha actualizado y ahora incluye devoluciones de llamada para resolver este problema. Eche un vistazo a http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl para obtener más información.
fuente
after(:create)
lugar deafter_create
en factory girl como se menciona aquí: stackoverflow.com/questions/15003968/…En mi opinión, solo crea dos fábricas diferentes como:
Cuando escriba los casos de prueba para el usuario, simplemente escriba así
Espero que funcione.
fuente
No pude encontrar un ejemplo para el caso mencionado anteriormente en el sitio web proporcionado. (Solo 1: N y asociaciones polimórficas, pero no habtm). Tuve un caso similar y mi código se ve así:
fuente
Lo que funcionó para mí fue establecer la asociación al usar la fábrica. Usando tu ejemplo:
fuente
Encontrado de esta manera agradable y detallado:
fuente
foos { |a| [a.association(:foo)] }
me ayuda mucho! ¡Gracias!Advertencia: cambie usuarios: [usuario] a: usuarios => [usuario] para ruby 1.8.x
fuente
after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }
:?En primer lugar, te recomiendo encarecidamente que uses has_many: through en lugar de habtm (más sobre esto aquí ), por lo que terminarás con algo como:
Después de esto, tendrá la asociación has_many en ambos lados y podrá asignarles en factory_girl de la forma en que lo hizo.
fuente
Employment belongs_to :user
yEmployment belongs_to :company
con el modelo de unión que conecta una empresa con un usuario?Actualización para Rails 5:
En lugar de utilizar la
has_and_belongs_to_many
asociación, debería considerar:has_many :through
asociación.La fábrica de usuarios para esta asociación se ve así:
Puede crear la fábrica de la empresa de forma similar.
Una vez configuradas ambas fábricas, puede crear una
user_with_companies
fábrica concompanies_count option
. Aquí puede especificar a cuántas empresas pertenece el usuario:create(:user_with_companies, companies_count: 15)
Puede encontrar una explicación detallada sobre las asociaciones de chicas de fábrica aquí .
fuente
Para HABTM utilicé rasgos y devoluciones de llamada .
Digamos que tiene los siguientes modelos:
Puede definir la Fábrica arriba :
fuente
Puede definir una nueva fábrica y usarla después de (: crear) devolución de llamada para crear una lista de asociaciones. Veamos cómo hacerlo en este ejemplo:
El atributo companies_count es transitorio y está disponible en los atributos de la fábrica y en la devolución de llamada a través del evaluador. Ahora, puede crear un usuario con empresas con la opción de especificar cuántas empresas desea:
fuente