Factory girl and nested attributes in rails 3

I have 2 models, one of which accepts attributes for the other, and I'm trying to find a smart way to use the Factory girl to set up data for both.

Class Booking has_many :booking_items accepts_nested_attributes_for :booking_items Class BookingItem belong_to :booking 

my factory

 Factory.define :booking do |f| f.bookdate Date.today+15.days f.association :space f.nights 2 f.currency "EUR" f.booking_item_attributes Factory.build(:booking_item) # doesn't work end Factory.define :booking_item do |f| f.association :room f.bookdate Date.today f.people 2 f.total_price 20 f.association :booking end 

booking_spec

 require "spec_helper" describe Booking do before(:each) do @booking = Factory.create(:booking) end it "should be valid" do #needs children to be valid @booking.should be_valid end end 

I looked through rdocs but could not find what I was looking for.

+4
source share
1 answer

If I understand you correctly, you want to do this, but with the syntax syntax:

 booking_item = Factory(:booking_item, :people => 4) booking = Factory(:booking, :booking_item => booking_item) 

Because of this, you can shorten it as follows:

 def with_assocs factory, assocs_hashes = {}, attrs = {} assoc_models = Hash[ assocs_hash.map { |k, v| [k, Factory(k, v)] } ] Factory factory, attrs.merge(assoc_models) end 

And use like this:

 @booking = with_assocs :booking, :booking_item => {:people => 3} @booking.should be_valid 

In the active_factory plugin with similar factory definitions, it will look like this:

 models { booking - booking_item(:people => 3) } booking.should be_valid 

Unfortunately, I have not implemented integration with factory_girl yet. Although if you are interested in any input, very welcome.

+8
source

All Articles