Angesichts der folgenden
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
Wie definieren Sie Fabriken für Unternehmen und Benutzer, einschließlich der bidirektionalen Vereinigung? Hier ist mein Versuch
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
jetzt versuche ich es
Factory :user
Es ist vielleicht nicht überraschend, dass dies zu einer Endlosschleife führt, da sich die Fabriken rekursiv gegenseitig verwenden, um sich selbst zu definieren.
Überraschender ist, dass ich nirgendwo erwähnt habe, wie das geht. Gibt es ein Muster für die Definition der erforderlichen Fabriken oder mache ich etwas grundlegend Falsches?
Factorygirl wurde inzwischen aktualisiert und enthält jetzt Rückrufe, um dieses Problem zu lösen. Weitere Informationen finden Sie unter http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl .
quelle
after(:create)
anstelle von Fabrikmädchen,after_create
wie hier erwähnt: stackoverflow.com/questions/15003968/…Meiner Meinung nach erstellen Sie einfach zwei verschiedene Fabriken wie:
Wenn Sie die Testfälle für den Benutzer schreiben, schreiben Sie einfach so
Hoffe es wird funktionieren.
quelle
Ich konnte auf der bereitgestellten Website kein Beispiel für den oben genannten Fall finden. (Nur 1: N und polymorphe Assoziationen, aber kein Habtm). Ich hatte einen ähnlichen Fall und mein Code sieht folgendermaßen aus:
quelle
Was für mich funktioniert hat, war das Festlegen der Zuordnung bei der Verwendung der Fabrik. Anhand Ihres Beispiels:
quelle
Fand diesen Weg schön und ausführlich:
quelle
foos { |a| [a.association(:foo)] }
hilft mir sehr! Danke dir!Warnung: Ändern Sie Benutzer: [Benutzer] in: Benutzer => [Benutzer] für Ruby 1.8.x.
quelle
after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }
?Zuallererst empfehle ich Ihnen dringend, has_many: through anstelle von habtm zu verwenden (mehr dazu hier ), damit Sie am Ende Folgendes erhalten :
Danach haben Sie auf beiden Seiten eine has_many-Zuordnung und können diese in factory_girl so zuweisen, wie Sie es getan haben.
quelle
Employment belongs_to :user
undEmployment belongs_to :company
mit dem Join-Modell, das ein Unternehmen mit einem Benutzer verbindet?Update für Rails 5:
Anstatt
has_and_belongs_to_many
Assoziation zu verwenden, sollten Sie Folgendes berücksichtigen:has_many :through
Assoziation.Die Benutzerfactory für diese Zuordnung sieht folgendermaßen aus:
Sie können die Firmenfabrik auf ähnliche Weise erstellen.
Sobald beide Fabriken eingestellt sind, können Sie eine
user_with_companies
Fabrik mit erstellencompanies_count option
. Hier können Sie angeben, zu wie vielen Unternehmen der Benutzer gehört:create(:user_with_companies, companies_count: 15)
Detaillierte Erklärungen zu Fabrikmädchenverbänden finden Sie hier .
quelle
Für HABTM habe ich Merkmale und Rückrufe verwendet .
Angenommen, Sie haben die folgenden Modelle:
Sie können die Fabrik oben definieren :
quelle
Sie können eine neue Factory definieren und nach dem Rückruf (: create) eine Liste mit Zuordnungen erstellen. Mal sehen, wie es in diesem Beispiel geht:
Das Attribut company_count ist vorübergehend und in den Attributen der Factory und im Rückruf über den Evaluator verfügbar. Jetzt können Sie einen Benutzer mit Unternehmen erstellen und festlegen, wie viele Unternehmen Sie möchten:
quelle