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, То же самое касается контактов, все верно. Проблема в том, что ресторан нене знаю о них (у него нет идентификаторов адресов или контактов), я не могуТ доступа к ним из ресторана, который я хочу.