सवाल Has_many एसोसिएशन के साथ फैक्टरीगर्ल में फैक्ट्री कैसे स्थापित करें


क्या कोई मुझे बता सकता है कि क्या मैं सिर्फ गलत तरीके से सेटअप के बारे में जा रहा हूं?

मेरे पास निम्नलिखित मॉडल हैं जिनमें has_many.through एसोसिएशन हैं:

class Listing < ActiveRecord::Base
  attr_accessible ... 

  has_many :listing_features
  has_many :features, :through => :listing_features

  validates_presence_of ...
  ...  
end


class Feature < ActiveRecord::Base
  attr_accessible ...

  validates_presence_of ...
  validates_uniqueness_of ...

  has_many :listing_features
  has_many :listings, :through => :listing_features
end


class ListingFeature < ActiveRecord::Base
  attr_accessible :feature_id, :listing_id

  belongs_to :feature  
  belongs_to :listing
end

मैं Rails 3.1.rc4, फैक्टरीगर्ल 2.0.2, factory_girl_rails 1.1.0, और rspec का उपयोग कर रहा हूं। यहां मेरे मूल आरएसपीसी आरएसपीसी सैनिटी चेक के लिए है :listing कारखाना:

it "creates a valid listing from factory" do
  Factory(:listing).should be_valid
end

यहां फैक्टरी है (: लिस्टिंग)

FactoryGirl.define do
  factory :listing do
    headline    'headline'
    home_desc   'this is the home description'
    association :user, :factory => :user
    association :layout, :factory => :layout
    association :features, :factory => :feature
  end
end

:listing_feature तथा :feature कारखानों को समान रूप से सेटअप कर रहे हैं।
अगर association :features लाइन पर टिप्पणी की गई है, तो मेरे सभी परीक्षण पास हो जाते हैं।
जब यह है

association :features, :factory => :feature

त्रुटि संदेश है undefined method 'each' for #<Feature>  जो मैंने सोचा था क्योंकि मुझे समझ में आया क्योंकि listing.features एक सरणी देता है। तो मैंने इसे बदल दिया

association :features, [:factory => :feature]

और अब मुझे मिली त्रुटि है ArgumentError: Not registered: features  क्या इस तरह फैक्ट्री ऑब्जेक्ट्स बनाने के लिए यह समझदारी नहीं है, या मुझे क्या याद आ रही है? किसी भी और सभी इनपुट के लिए बहुत बहुत धन्यवाद!


76
2017-08-05 22:30


मूल




जवाब:


इन प्रकार के संगठनों को बनाने के लिए फैक्टरीगर्ल के कॉलबैक का उपयोग करना आवश्यक है।

उदाहरणों का एक आदर्श सेट यहां पाया जा सकता है।

http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl

इसे अपने उदाहरण में घर लाने के लिए।

Factory.define :listing_with_features, :parent => :listing do |listing|
  listing.after_create { |l| Factory(:feature, :listing => l)  }
  #or some for loop to generate X features
end

51
2017-10-11 23:04



क्या आपने एसोसिएशन का उपयोग करके अंत किया: विशेषताएं, [: फैक्ट्री =>: फीचर]? - davidtingsu


वैकल्पिक रूप से, आप एक ब्लॉक का उपयोग कर सकते हैं और छोड़ सकते हैं association कीवर्ड। इससे डाटाबेस को सहेजे बिना ऑब्जेक्ट्स बनाना संभव हो जाता है (अन्यथा, एक है_मनी एसोसिएशन आपके रिकॉर्ड को डीबी में सहेज लेगा, भले ही आप इसका इस्तेमाल करें build के बजाय समारोह create)।

FactoryGirl.define do
  factory :listing_with_features, :parent => :listing do |listing|
    features { build_list :feature, 3 }
  end
end

85
2017-09-25 17:11



यह बिल्ली का मेयो है। दोनों की क्षमता build तथा create यह सबसे बहुमुखी पैटर्न बनाता है। फिर इस कस्टम एफजी निर्माण रणनीति का उपयोग करें gist.github.com/Bartuz/74ee5834a36803d712b7 सेवा मेरे post nested_attributes_for जब नियंत्रक क्रियाओं का परीक्षण करते हैं accepts_nested_attributes_for - Chris Beck
अपरिवर्तित, स्वीकार्य उत्तर आईएमओ की तुलना में कहीं अधिक पठनीय और बहुमुखी - m_x


मैंने कुछ अलग दृष्टिकोणों की कोशिश की और यह वह है जो मेरे लिए सबसे अधिक भरोसेमंद काम करता है (आपके मामले में अनुकूलित)

FactoryGirl.define do
  factory :user do
    # some details
  end

  factory :layout do
    # some details
  end

  factory :feature do
    # some details
  end

  factory :listing do
    headline    'headline'
    home_desc   'this is the home description'
    association :user, factory: :user
    association :layout, factory: :layout
    after(:create) do |liztng|
      FactoryGirl.create_list(:feature, 1, listing: liztng)
    end
  end
end

20
2017-11-15 03:51





आप उपयोग कर सकते हैं trait:

FactoryGirl.define do
  factory :listing do
    ...

    trait :with_features do
      features { build_list :feature, 3 }
    end
  end
end

साथ में callback, अगर आपको डीबी निर्माण की आवश्यकता है:

...

trait :with_features do
  after(:create) do |listing|
    create_list(:feature, 3, listing: listing)
  end
end

इस तरह अपने चश्मे में प्रयोग करें:

let(:listing) { create(:listing, :with_features) }

यह आपके कारखानों में नकल को हटा देगा और अधिक पुन: प्रयोज्य होगा।

https://robots.thoughtbot.com/remove-duplication-with-factorygirls-traits


13
2018-01-23 18:39





यहां बताया गया है कि मैंने अपना सेट कैसे किया:

# Model 1 PreferenceSet
class PreferenceSet < ActiveRecord::Base
  belongs_to :user
  has_many :preferences, dependent: :destroy
end

#Model 2 Preference

class Preference < ActiveRecord::Base    
  belongs_to :preference_set
end



# factories/preference_set.rb

FactoryGirl.define do
  factory :preference_set do
    user factory: :user
    filter_name "market, filter_structure"

    factory :preference_set_with_preferences do
      after(:create) do |preference|
        create(:preference, preference_set: preference)
        create(:filter_structure_preference, preference_set: preference)
      end
    end
  end

end

# factories/preference.rb

FactoryGirl.define do
  factory :preference do |p|
    filter_name "market"
    filter_value "12"
  end

  factory :filter_structure_preference, parent: :preference do
    filter_name "structure"
    filter_value "7"
  end
end

और फिर अपने परीक्षणों में आप कर सकते हैं:

@preference_set = FactoryGirl.create(:preference_set_with_preferences)

उम्मीद है की वो मदद करदे।


0
2017-09-08 16:20