কারখানার মেয়েটিতে কীভাবে #______________________________________________________________________________________________________________________________________________________________________________________________________________________________


119

নিম্নলিখিত দেওয়া

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

সম্ভবত আশ্চর্যজনকভাবে এগুলির ফলাফল অসীম লুপের কারণ কারখানাগুলি পুনরাবৃত্তভাবে নিজেদের সংজ্ঞায়িত করার জন্য একে অপরকে ব্যবহার করে।

আরও আশ্চর্যজনকভাবে আমি কোথাও এটি কীভাবে করব সে সম্পর্কে কোনও উল্লেখ খুঁজে পাইনি, প্রয়োজনীয় কারখানাগুলি সংজ্ঞায়নের জন্য কি কোনও নমুনা রয়েছে বা আমি মৌলিকভাবে কিছু ভুল করছি?

উত্তর:


132

আমার জন্য কাজ করে এমন সমাধান এখানে।

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])

আশা করি এটি কারও পক্ষে সহায়ক হবে।


4
আপনাকে ধন্যবাদ, সমস্ত সমাধানগুলির মধ্যে সবচেয়ে ঝরঝরে।
মিক

ধন্যবাদ. কয়েক ঘন্টা হতাশার পরে এটি আমার সমস্যার সমাধান করেছে।
টনি বেনিনেট

এটি কেবল তখনই কাজ করে যখন সমস্ত কারখানাগুলি একটি ফাইলে থাকে যা বেশ অযাচিত। সুতরাং নীচে @opsb দ্বারা উল্লিখিত সমাধানটি আরও ভাল বলে মনে হচ্ছে।
স্পায়ার

40

কারখানাগার্ল তখন থেকে আপডেট হয়েছে এবং এখন এই সমস্যা সমাধানের জন্য কলব্যাক অন্তর্ভুক্ত রয়েছে। কটাক্ষপাত http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl আরও তথ্যের জন্য।


37
লিঙ্কটি আসলে_আর_বেলং_স_মন্যিকে কীভাবে পরিচালনা করতে পারে তা বলে না ... এটি কীভাবে করা যায় তা আমি দেখছি না ...
ডেমোনপলি

3
কলব্যাক সিনট্যাক্স এখন পরিবর্তিত হয়েছে: after(:create)পরিবর্তে after_create: কারখানা মেয়ে এখানে হিসাবে উল্লেখ করেছে stackoverflow.com/questions/15003968/...
মাইকেল Yagudaev

22

আমার মতে, কেবল দুটি আলাদা কারখানা তৈরি করুন যেমন:

 ফ্যাক্টরি.ডিফাইন: ব্যবহারকারী, শ্রেণি => ব্যবহারকারীর | ইউ |
  # শুধু সাধারণ বৈশিষ্ট্য সূচনা
 শেষ

 ফ্যাক্টরি.ডিফাইন: সংস্থা,: শ্রেণী => সংস্থা কর | ইউ |
  # শুধু সাধারণ বৈশিষ্ট্য সূচনা
 শেষ

আপনি যখন ব্যবহারকারীর জন্য পরীক্ষা-কেসগুলি লিখেন তখন ঠিক এভাবে লিখুন

 কারখানা (: ব্যবহারকারী,: সংস্থা => [কারখানা (: সংস্থা)])

আশা করি এটি কার্যকর হবে।


2
ধন্যবাদ আমি কাজ করতে পারে এই একমাত্র উদাহরণ। কারখানার মেয়ে হাবটেমের জন্য একটি বড় মাথাব্যথা।
jspooner

এটি আর কারখানার গার্লের সাম্প্রতিক সংস্করণগুলির সাথে কাজ করে না (আমি রেল 3 ভাবি)
রাফ

9

আমি প্রদত্ত ওয়েবসাইটে উল্লিখিত মামলার উদাহরণ খুঁজে পাই না। (কেবলমাত্র 1: এন এবং বহুকোষী সমিতি, তবে কোনও অভ্যাস নেই)। আমার অনুরূপ কেস হয়েছিল এবং আমার কোডটি এরকম দেখাচ্ছে:

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

3
শূন্য-ব্যবহারকারীর গণনার বৈধতা থাকলে কী হবে?
dfens

5

আমার জন্য যা কাজ করেছিল তা কারখানাটি ব্যবহার করার সময় সমিতি স্থাপন করছিল। আপনার উদাহরণ ব্যবহার করে:

user = Factory(:user)
company = Factory(:company)

company.users << user 
company.save! 

4

এই উপায়টি সুন্দর এবং ভার্বোজ পেয়েছে:

FactoryGirl.define do
  factory :foo do
    name "Foo" 
  end

  factory :bar do
    name "Bar"
    foos { |a| [a.association(:foo)] }
  end
end

1
foos { |a| [a.association(:foo)] }আমাকে অনেক সাহায্য করে! ধন্যবাদ!
মন্টেইরোব্রেনা

3
  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

সতর্কতা: রুবি ১.৮.x এর জন্য ব্যবহারকারী: [ব্যবহারকারী] এ: ব্যবহারকারী => [ব্যবহারকারী] পরিবর্তন করুন


4
এটা হওয়া উচিত নয় : after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }?
রাফ

0

সবার আগে আমি আপনাকে দৃ_়ভাবে 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

এর পরে আপনার উভয় পক্ষেই_সামান্য সংযোগ থাকবে এবং আপনি যেভাবে এটি করেছেন ফ্যাক্টরি_গর্লে তাদের নির্ধারণ করতে পারেন।


3
এমনটি কি হওয়া উচিত নয় Employment belongs_to :userএবং Employment belongs_to :companyযোগদানকারী মডেলটির সাথে একটি কোম্পানিকে একজন ব্যবহারকারীর সাথে সংযুক্ত করতে হবে?
ড্যানিয়েল বিয়ার্ডসলে

5
আপনি যে পোস্টটি উল্লেখ করেছেন তার মাধ্যমে দ্রুত পড়া থেকে আমার উপসংহারটি হ'ব এইচটিএম বা হ্যাস_ম্যানি: মাধ্যমে চয়ন করা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। কোনও আসল "বিজয়ী" নেই।
আওরালবী

ঠিক আছে, এইচএমটি ব্যবহার করার সময় কেবলমাত্র ওভারহেড হ'ল আপনাকে অবশ্যই টেবিলের মাধ্যমে আইডি সংজ্ঞায়িত করতে হবে। এই মুহুর্তে, আমি কোনও পরিস্থিতি কল্পনা করতে পারি না যখন এটি কোনও সমস্যার কারণ হতে পারে। আমি বলি না যে হাবটেমের কোনও লাভ নেই, কেবলমাত্র 99% ব্যবহারের ক্ষেত্রে এটি এইচএমটি ব্যবহার করা আরও বোধ করে (তার সুবিধার কারণে)।
মিলান নভোটা

6
-১, এইচএমটি-র আরও বেশি 'সুবিধা' রয়েছে বলে কেবলমাত্র আপনি যদি এই সুবিধাগুলি প্রয়োজন হয় তবে আপনার এটি ব্যবহার করা উচিত। পোষ্যের উঁকি, কারণ আমি এখন এমন একটি প্রকল্পে কাজ করছি যেখানে ডেভেলপাররা এইচএমটি ব্যবহার করেছিল এমন বেশ কয়েকটি ক্ষেত্রে যেখানে এইচএবিটিএম যথেষ্ট ছিল। কোডবেস অতএব বৃহত্তর, আরও জটিল, কম স্বজ্ঞাত এবং ধীরে ধীরে এসকিউএল উত্পাদন করে কারণ এটি। সুতরাং, হ্যাবটিএম ব্যবহার করুন যখন আপনি পারবেন, তারপরে যখন প্রতিটি সমিতি সম্পর্কে অতিরিক্ত তথ্য সংরক্ষণের জন্য পৃথক জোড় মডেল তৈরি করার দরকার হয়, কেবল তখনই এইচএমটি ব্যবহার করুন।
sbeam

0

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)

আপনি এখানে কারখানার মেয়েদের সমিতি সম্পর্কে বিস্তারিত ব্যাখ্যা পেতে পারেন ।


0

এইচএবিটিএম এর জন্য আমি বৈশিষ্ট্য এবং কলব্যাকগুলি ব্যবহার করেছি

বলুন আপনার কাছে নিম্নলিখিত মডেল রয়েছে:

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

-1

আপনি নতুন কারখানা সংজ্ঞায়িত করতে পারেন এবং সমিতির তালিকা তৈরি করতে (: তৈরি করুন) কলব্যাকের পরে ব্যবহার করতে পারেন। আসুন দেখুন এই উদাহরণে এটি কীভাবে করা যায়:

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

অ্যাট্রিবিউট সংস্থাগুলি_কাউন্টটি একটি ক্ষণস্থায়ী এবং কারখানার বৈশিষ্ট্যগুলিতে এবং মূল্যবোধকের মাধ্যমে কলব্যাকে উপলব্ধ। এখন, আপনি কতগুলি সংস্থা চান তা নির্দিষ্ট করার বিকল্প সহ আপনি সংস্থাগুলি সহ একটি ব্যবহারকারী তৈরি করতে পারেন:

create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.