Biorąc pod uwagę następujące kwestie
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
jak definiujecie fabryki dla firm i użytkowników, w tym stowarzyszenie dwukierunkowe? Oto moja próba
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
teraz próbuję
Factory :user
Być może nie jest zaskakujące, że prowadzi to do nieskończonej pętli, ponieważ fabryki rekurencyjnie używają siebie nawzajem do definiowania siebie.
Co bardziej zaskakujące, nigdzie nie znalazłem wzmianki o tym, jak to zrobić, czy istnieje schemat definiowania niezbędnych fabryk, czy też robię coś zasadniczo nie tak?
Usługa Factorygirl została od tego czasu zaktualizowana i zawiera teraz wywołania zwrotne w celu rozwiązania tego problemu. Zajrzyj na http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl, aby uzyskać więcej informacji.
źródło
after(:create)
zamiastafter_create
w factory girl, jak wspomniano tutaj: stackoverflow.com/questions/15003968/…Moim zdaniem wystarczy stworzyć dwie różne fabryki, takie jak:
Kiedy piszesz przypadki testowe dla użytkownika, po prostu pisz w ten sposób
Mam nadzieję, że to zadziała.
źródło
Nie mogłem znaleźć przykładu dla wyżej wymienionego przypadku na podanej stronie internetowej. (Tylko związki 1: N i polimorficzne, ale bez habtm). Miałem podobny przypadek i mój kod wygląda tak:
źródło
U mnie zadziałało tworzenie skojarzeń podczas korzystania z fabryki. Na podstawie twojego przykładu:
źródło
Znalazłem w ten sposób ładne i szczegółowe:
źródło
foos { |a| [a.association(:foo)] }
bardzo mi pomaga! Dziękuję Ci!Ostrzeżenie: Zmień użytkowników: [użytkownik] na: użytkownicy => [użytkownik] dla Ruby 1.8.x
źródło
after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }
:?Przede wszystkim gorąco zachęcam do korzystania z has_many: through zamiast habtm (więcej o tym tutaj ), więc otrzymasz coś takiego:
Po tym będziesz miał asocjacje po obu stronach i będziesz mógł przypisywać je do nich w factory_girl w sposób, w jaki to zrobiłeś.
źródło
Employment belongs_to :user
iEmployment belongs_to :company
przy modelu łączenia łączącym jedną firmę z jednym użytkownikiem?Aktualizacja dla Rails 5:
Zamiast używać
has_and_belongs_to_many
asocjacji, powinieneś rozważyć:has_many :through
skojarzenie.Fabryka użytkowników dla tego powiązania wygląda następująco:
W podobny sposób możesz stworzyć fabrykę firmy.
Po ustawieniu obu fabryk możesz utworzyć
user_with_companies
fabrykę za pomocącompanies_count option
. Tutaj możesz określić, do ilu firm należy użytkownik:create(:user_with_companies, companies_count: 15)
Szczegółowe informacje na temat stowarzyszeń fabrykantów można znaleźć tutaj .
źródło
W przypadku HABTM użyłem cech i zwrotów .
Załóżmy, że masz następujące modele:
Możesz zdefiniować fabrykę powyżej :
źródło
Możesz zdefiniować nową fabrykę i użyć po (: create) callback do stworzenia listy skojarzeń. Zobaczmy, jak to zrobić w tym przykładzie:
Atrybut Companies_count jest przejściowy i jest dostępny w atrybutach fabryki oraz w wywołaniu zwrotnym za pośrednictwem oceniającego. Teraz możesz utworzyć użytkownika z firmami z opcją określenia, ile chcesz firm:
źródło