заводская девушка и nested_attributes в рельсах 3 - PullRequest
4 голосов
/ 20 апреля 2011

У меня есть 2 модели, одна из которых принимает атрибуты другой, и я пытаюсь найти умный способ использовать Factory girl для настройки данных для обеих.

Class Booking
has_many :booking_items
accepts_nested_attributes_for :booking_items

Class BookingItem
belong_to :booking

моя фабрика

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

Я огляделся, но не смог найти то, что искал.

1 Ответ

8 голосов
/ 20 апреля 2011

Если я правильно вас понял, вы хотите сделать это, но с более кратким синтаксисом:

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

Потому что вы можете ярлык это так:

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

И использовать какэто:

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

В плагине active_factory с аналогичными определениями фабрики это будет выглядеть так:

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

К сожалению, я еще не реализовал интеграцию с factory_girl.Хотя, если вы заинтересованы, любой вход очень приветствуется.

...