Wie has_and_belongs_to_many Verbände in der Fabrik Mädchen erstellen
-
18-09-2019 - |
Frage
In Anbetracht 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 Anwender einschließlich der bidirektionalen Verein? 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,
Factory :user
Vielleicht nicht überraschend führt dies zu einer Endlosschleife wie die Fabriken rekursiv sich verwenden, um sie zu definieren.
Noch überraschender habe ich keine Erwähnung gefunden, wie dies überall zu tun, ist es ein Muster, die notwendigen Fabriken für die Definition oder ich tue etwas grundlegend falsch?
Lösung 2
factory da wurde aktualisiert und enthält nun Rückrufe dieses Problem zu lösen. Schauen Sie sich auf http://robots.thoughtbot.com/post / 254496652 / aint-no-calla-back-Mädchen für weitere Informationen.
Andere Tipps
Hier ist die Lösung, die für mich funktioniert.
FactoryGirl.define do
factory :company do
#company attributes
end
factory :user do
companies {[FactoryGirl.create(:company)]}
#user attributes
end
end
Wenn Sie bestimmte Unternehmen benötigen Sie können auf diese Weise verwenden Fabrik
company = FactoryGirl.create(:company, #{company attributes})
user = FactoryGirl.create(:user, :companies => [company])
Hope dies für jemanden nützlich sein wird.
Meiner Meinung nach, Erstellen Sie einfach zwei verschiedene Fabriken wie:
Factory.define :user, :class => User do |u| # Just normal attributes initialization end Factory.define :company, :class => Company do |u| # Just normal attributes initialization end
Wenn Sie die Testfälle für Benutzer schreiben dann einfach so schreiben
Factory(:user, :companies => [Factory(:company)])
Hoffe, dass es funktionieren wird.
Ich kann nicht ein Beispiel für den oben erwähnten Fall auf der bereitgestellten Website. (Nur 1: N und polymorphe assocations, aber keine HABTM). Ich hatte einen ähnlichen Fall und mein Code sieht wie folgt aus:
Factory.define :user do |user|
user.name "Foo Bar"
user.after_create { |u| Factory(:company, :users => [u]) }
end
Factory.define :company do |c|
c.name "Acme"
end
Was für mich gearbeitet wurde die Assoziation eingestellt wird, wenn die Fabrik mit. Mit Ihrem Beispiel:
user = Factory(:user)
company = Factory(:company)
company.users << user
company.save!
factory :company_with_users, parent: :company do
ignore do
users_count 20
end
after_create do |company, evaluator|
FactoryGirl.create_list(:user, evaluator.users_count, users: [user])
end
end
Achtung: Ändern Benutzer: [user] an: Benutzer => [user] für Ruby 1.8.x
Findet diese Art und Weise schön und ausführliche:
FactoryGirl.define do
factory :foo do
name "Foo"
end
factory :bar do
name "Bar"
foos { |a| [a.association(:foo)] }
end
end
Als erstes habe ich Sie dringend ermutigen has_many zu nutzen: durch statt HABTM (mehr dazu: hier ), so dass Sie wie am Ende mit etwas:
Employment belongs_to :users
Employment belongs_to :companies
User has_many :employments
User has_many :companies, :through => :employments
Company has_many :employments
Company has_many :users, :through => :employments
Danach werden Sie has_many Verein auf beiden Seiten haben und sie in factory_girl in der Art und Weise zuordnen können Sie es getan haben.
Update für Rails 5:
Statt has_and_belongs_to_many
Assoziation zu verwenden, sollten Sie berücksichtigen:. has_many :through
Vereinigung
Der Benutzer Fabrik für diesen Verein sieht wie folgt aus:
FactoryBot.define do
factory :user do
# user attributes
factory :user_with_companies do
transient do
companies_count 10 # default number
end
after(:create) do |user, evaluator|
create_list(:companies, evaluator.companies_count, user: user)
end
end
end
end
Sie können die Firma Fabrik in ähnlicher Weise erstellen.
Sobald beide Fabriken eingestellt sind, können Sie user_with_companies
Fabrik mit companies_count option
erstellen. Hier können Sie festlegen, wie viele Unternehmen der Benutzer gehört: create(:user_with_companies, companies_count: 15)
Sie können ausführliche Erklärung finden über Fabrik Mädchen Verbände hier .
Sie können neues Werk und die Verwendung nach definieren (: create) Rückruf eine Liste der Verbände zu erstellen. Mal sehen, wie es in diesem Beispiel zu tun:
FactoryBot.define do
# user factory without associated companies
factory :user do
# user attributes
factory :user_with_companies do
transient do
companies_count 10
end
after(:create) do |user, evaluator|
create_list(:companies, evaluator.companies_count, user: user)
end
end
end
end
Attribut companies_count ist eine vorübergehende und in Attributen der Fabrik und in der Rückruf über den Bewerter. Jetzt können Sie einen Benutzer mit Unternehmen mit der Option erstellen, um festzulegen, wie viele Unternehmen Sie wollen:
create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15
Für HABTM Ich benutzte Züge und Rückrufe .
Angenommen, Sie haben die folgenden Modelle:
class Catalog < ApplicationRecord
has_and_belongs_to_many :courses
…
end
class Course < ApplicationRecord
…
end
Sie können definieren die Fabrik über :
FactoryBot.define do
factory :catalog do
description "Catalog description"
…
trait :with_courses do
after :create do |catalog|
courses = FactoryBot.create_list :course, 2
catalog.courses << courses
catalog.save
end
end
end
end