كيفية إنشاء جمعيات Has_and_belongs_to_many في Factory Girl
-
18-09-2019 - |
سؤال
بالنظر إلى ما يلي
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
كيف تحدد المصانع للشركات والمستخدمين بما في ذلك الرابطة ثنائية الاتجاه؟ ها هي محاولتي
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
الآن أنا أحاول
Factory :user
ربما لا يقرر ذلك أن هذا ينتج عنه حلقة لا حصر لها لأن المصانع تستخدم بعضها البعض بشكل متكرر لتحديد أنفسهم.
أكثر من المستغرب، لم أجد ذكر كيفية القيام بذلك في أي مكان، هل هناك نمط لتحديد المصانع اللازمة أو أفعل شيئا خاطئا بشكل أساسي؟
المحلول 2
منذ ذلك الحين تم تحديث FactoryGirl ويتضمن الآن عمليات الاسترجاعات لحل هذه المشكلة. إلقاء نظرة على http://robots.thoughedbot.com/post/254496652/aint-no-calla-back-girl. لمزيد من المعلومات.
نصائح أخرى
هنا هو الحل الذي يعمل بالنسبة لي.
FactoryGirl.define do
factory :company do
#company attributes
end
factory :user do
companies {[FactoryGirl.create(:company)]}
#user attributes
end
end
إذا كنت بحاجة إلى شركة محددة، يمكنك استخدام المصنع بهذه الطريقة
company = FactoryGirl.create(:company, #{company attributes})
user = FactoryGirl.create(:user, :companies => [company])
آمل أن يكون هذا مفيدا لشخص ما.
في رأيي، فقط إنشاء مصنعين مختلفين مثل:
Factory.Define: المستخدم،: Class => المستخدم DO | U | # Just Normal Attributes Inditionitization End Factory.Define: شركة،: فئة => company do | u | # فقط تهدئة السمات الطبيعية تهيئة
عند كتابة حالات الاختبار للمستخدم، اكتب مثل هذا
مصنع (: المستخدم،: الشركات => [مصنع (: شركة)])
آمل أن تعمل.
لم أستطع إيجاد مثال للحالة المذكورة أعلاه على الموقع المقدم. (فقط 1: n وشبك متعدد الألوان، ولكن لا habtm). كان لدي حالة مماثلة ومجمد لي يبدو وكأنه هذا:
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
ما كان يعمل بالنسبة لي كان يحدد الارتباط عند استخدام المصنع. باستخدام مثالك:
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
تحذير: تغيير المستخدمين: [User] إلى: المستخدمون => [مستخدم] ل Ruby 1.8.x
وجدت بهذه الطريقة لطيفة وحمامات:
FactoryGirl.define do
factory :foo do
name "Foo"
end
factory :bar do
name "Bar"
foos { |a| [a.association(:foo)] }
end
end
بادئ ذي بدء، أشجعك بشدة على استخدام has_many: من خلال بدلا من habtm (المزيد عن هذا هنا)، لذلك سوف ينتهي بك الأمر مع شيء مثل:
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
بعد ذلك، سيكون لديك رابطة Has_many على كلا الجانبين ويمكنها تعيينها في Factory_Girl في الطريقة التي فعلتها بها.
تحديث للقضبان 5:
بدلا من استخدام has_and_belongs_to_many
جمعية، يجب أن تنظر: has_many :through
منظمة.
يبدو أن مصنع المستخدم لهذا الجمعية مثل هذا:
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
يمكنك إنشاء مصنع الشركة بطريقة مماثلة.
بمجرد تعيين كل من المصانع، يمكنك إنشاء user_with_companies
مصنع مع companies_count option
. وبعد هنا يمكنك تحديد عدد الشركات التي ينتمي إليها المستخدم: create(:user_with_companies, companies_count: 15)
يمكنك العثور على شرح مفصل حول فتاة مصنع الجمعيات هنا.
يمكنك تحديد مصنع جديد واستخدامه بعد (: إنشاء) رد الاتصال لإنشاء قائمة بالاتصالات. دعونا نرى كيفية القيام بذلك في هذا المثال:
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
الشركات السمة_Count هي عابرة ومتاحة في سمات المصنع وفي رد الاتصال عبر المقيم. الآن، يمكنك إنشاء مستخدم لدى الشركات مع خيار تحديد عدد الشركات التي تريدها:
create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15
ل Habtm استخدمت الصفات والمعارين.
قل لديك النماذج التالية:
class Catalog < ApplicationRecord
has_and_belongs_to_many :courses
…
end
class Course < ApplicationRecord
…
end
يمكنك تحديد المصنع أعلاه:
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