Factory Girl с полиморфной ассоциацией для has_many и has_one

В настоящее время я работаю над проектом, и я хотел создать тесты, используя заводскую девушку, но яЯ не могу заставить его работать с полиморфной ассоциацией has_many. Я'Мы пробовали много разных возможностей, упомянутых в других статьях, но это все еще нет работа. Моя модель выглядит так:

class Restaurant < ActiveRecord::Base
  has_one :address, as: :addressable, dependent: :destroy
  has_many :contacts, as: :contactable, dependent: :destroy

  accepts_nested_attributes_for :contacts, allow_destroy: true
  accepts_nested_attributes_for :address, allow_destroy: true

  validates :name, presence: true
  #validates :address, presence: true
  #validates :contacts, presence: true
end

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true

  # other unimportant validations, address is created valid, the problem is not here
end

class Contact < ActiveRecord::Base
  belongs_to :contactable, polymorphic: true
  # validations ommitted, contacts are created valid
end

В общем, я хочу создать фабрику для ресторана с адресом и контактами (с проверками на наличие ресторана, но если это такневозможно даже без них) но яЯ не могу этого сделать. Окончательный синтаксис должен быть таким:

let(:restaurant) { FactoryGirl.create(:restaurant) }

Который также должен создать связанный адрес и контакты. Я прочитал много статей, но всегда получаю какую-то ошибку. В настоящее время мои фабрики (последовательности определены правильно) выглядят так:

factory :restaurant do
  name
  # address {FactoryGirl.create(:address, addressable: aaa)}
  # contacts {FactoryGirl.create_list(:contact,4, contactable: aaa)}
  # Validations are off, so this callback is possible
  after(:create) do |rest|
    # Rest has ID here
    rest.address = create(:restaurant_address, addressable: rest)
    rest.contacts = create_list(:contact,4, contactable: rest)
  end
end

factory :restaurant_address, class: Address do
  # other attributes filled from sequences...

  association :addressable, factory: :restaurant
  # addressable factory: restaurant
  # association(:restaurant)
end

factory :contact do
  contact_type
  value

  association :contactable, :factory => :restaurant
end

Есть ли способ создать ресторан одной тестовой командой с заданными адресами и контактами? Мне действительно нужно избавиться от моих проверок из-за обратного вызова после (: create)? Текущее состояние как бы:

Ресторан создан с именем и идентификатором.После создания адреса - все правильно, в нем есть все значения, включая addressable_id и addressable_typeПосле этого все контакты создаются, опять все хорошо, у cntacts правильные значения.После этого ресторан неУ него нет идентификаторов из связанных объектов, нет связи с адресом или контактами.После этого по какой-то причине ресторан строится заново (может быть, для добавления этих ассоциаций?), И он не работает: я получаю ActiveRecord: RecordInvalid.I '

м с использованием factory_girl_rails 4.3.0, ruby 1.9.3 и рельсов 4.0.1. Буду рад любой помощи.

ОБНОВЛЕНИЕ 1:

Просто для разъяснения моей цели, я хочу иметь возможность создавать ресторан в своей спецификации с помощью одной команды и иметь возможность доступа к связанному адресу и контактам, которые должны быть созданы при создании ресторана. Позволять's игнорируют все проверки (я прокомментировал их в моем примере с самого начала). Когда я используюпосле того, как (: сборка), создается первый ресторан, затем адрес создается вместе с рестораномs ID какaddressable_id и имя класса какaddressable_type, То же самое касается контактов, все верно. Проблема в том, что ресторан нене знаю о них (у него нет идентификаторов адресов или контактов), я не могуТ доступа к ним из ресторана, который я хочу.

Ответы на вопрос(2)

Ваш ответ на вопрос