سؤال

بالنظر إلى ما يلي

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top