Has_many সমিতির সাথে কীভাবে ফ্যাক্টরিগার্লে কারখানা স্থাপন করবেন G


90

কেউ যদি আমাকে বলতে পারে যে আমি ঠিক সেটআপটি ভুল পথে চালাচ্ছি?

আমার কাছে নিম্নলিখিত মডেলগুলি রয়েছে যা 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

আমি রেলগুলি ৩.১.সিআরসি ৪, ফ্যাক্টরিজর্ল ২.০.২, ফ্যাক্টরি_গার্ল_রেইলস ১.১.০ এবং আরএসপিএক ব্যবহার করছি। :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লাইনটি মন্তব্য করা হয়, তবে আমার সমস্ত পরীক্ষা পাস হয় pass
কখন

association :features, :factory => :feature

ত্রুটি বার্তাটি undefined method 'each' for #<Feature> যা আমি আমার কাছে বোধগম্য করেছি কারণ listing.featuresএকটি অ্যারে ফিরিয়ে দেয়। সুতরাং আমি এটি পরিবর্তন

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

এবং আমি যে ত্রুটিটি পেয়েছি ArgumentError: Not registered: features তা হ'ল এইভাবে কারখানার অবজেক্ট তৈরি করা কি বুদ্ধিমানের নয়, বা আমি কী অনুপস্থিত? যে কোনও এবং সমস্ত ইনপুট জন্য অনেক ধন্যবাদ!

উত্তর:


58

এই ধরণের সমিতি তৈরি করতে ফ্যাক্টরিগার্লের কলব্যাকগুলি ব্যবহার করা দরকার।

উদাহরণগুলির একটি নিখুঁত সেট এখানে পাওয়া যাবে।

https://thoughtbot.com/blog/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

আপনি কি সমিতি ব্যবহার করে শেষ করেছেন: বৈশিষ্ট্য, [: কারখানা =>: বৈশিষ্ট্য]?
ডেভিডিংসু

110

বিকল্পভাবে, আপনি একটি ব্লক ব্যবহার করতে পারেন এবং associationকীওয়ার্ডটি এড়িয়ে যেতে পারেন । এটি ডাটাবেসে সংরক্ষণ না করেই অবজেক্ট তৈরি করা সম্ভব করে তোলে (অন্যথায়, একটি has_many সমিতি আপনার রেকর্ডগুলি ডিবিতে সংরক্ষণ করবে, এমনকি যদি আপনি buildপরিবর্তে ফাংশনটি ব্যবহার করেন create)।

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

4
এটি বিড়ালের মিয়া। উভয়ের দক্ষতা buildএবং createএটিকে সর্বাধিক বহুমুখী নিদর্শন করে তোলে। তারপরে নিয়ন্ত্রক ক্রিয়াকলাপ পরীক্ষা করার জন্য এই কাস্টম এফজি বিল্ড কৌশল gist.github.com/Bartuz/74ee5834a36803d712b7 ব্যবহার করুন post nested_attributes_forযাaccepts_nested_attributes_for
ক্রিস বেক

4
উত্সাহিত, গৃহীত উত্তর চেয়ে অনেক বেশি পঠনযোগ্য এবং বহুমুখী IMO
m_x

4
ফ্যাক্টরিবট 5 হিসাবে, কীওয়ার্ডটি associationপিতামাতার এবং সন্তানের জন্য একই বিল্ড কৌশল ব্যবহার করে। সুতরাং এটি ডাটাবেসটিতে ডাব্লু / ও সেভ করে অবজেক্ট তৈরি করতে পারে।
নিক

30

আপনি ব্যবহার করতে পারেন 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-dusedation-with-factorygirls-traits


20

আমি কয়েকটি ভিন্ন পদ্ধতির চেষ্টা করেছি এবং এটিই আমার জন্য সবচেয়ে নির্ভরযোগ্যভাবে কাজ করেছে (আপনার ক্ষেত্রে খাপ খাইয়ে নিয়েছে)

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

0

এখানে আমি কীভাবে সেট আপ করব:

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

আশা করি এইটি কাজ করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.