Factory Girl z polimorficznym powiązaniem dla has_many i has_one
Obecnie pracuję nad projektem i chciałem utworzyć testy przy użyciu fabryki girl, ale nie mogę sprawić, by działał z polimorficznym skojarzeniem has_many. Próbowałem wielu różnych możliwości wymienionych w innych artykułach, ale nadal nie działa. Mój model wygląda tak:
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
Tak więc chciałbym stworzyć fabrykę dla restauracji z adresem i kontaktami (z potwierdzeniem obecności w restauracji, ale jeśli nie jest to możliwe, nawet bez nich), ale nie mogę tego zrobić. Końcowa składnia powinna wyglądać następująco:
let(:restaurant) { FactoryGirl.create(:restaurant) }
Które powinny również tworzyć powiązane adresy i kontakty. Przeczytałem wiele artykułów, ale zawsze mam jakiś błąd. Obecnie moje fabryki (sekwencje są poprawnie zdefiniowane) są następujące:
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
Czy istnieje sposób na utworzenie restauracji z jednym poleceniem w teście z ustawionymi adresami i kontaktami? Czy naprawdę muszę pozbyć się moich walidacji z powodu wywołania zwrotnego (: create)? Bieżący stan jest taki sam:
Restauracja jest tworzona z nazwą i identyfikatorem.Niż adres jest tworzony - wszystko jest poprawne, ma wszystkie wartości, w tym addressable_id i addressable_typePo tym, jak wszystkie kontakty są tworzone, znowu wszystko jest w porządku, kontakty mają odpowiednie wartości.Potem restauracja nie ma żadnych identyfikatorów z powiązanych obiektów, żadnych powiązań z adddress lub kontaktamiPóźniej, z jakiegoś powodu restauracja jest ponownie budowana (może by dodać te skojarzenia?) I kończy się niepowodzeniem: dostaję ActiveRecord: RecordInvalid.Używam factory_girl_rails 4.3.0, ruby 1.9.3 i rails 4.0.1. Będę zadowolony z wszelkiej pomocy.
AKTUALIZACJA 1:
Aby wyjaśnić mój cel, chcę móc utworzyć restaurację w mojej specyfikacji za pomocą jednego polecenia i móc uzyskać dostęp do powiązanego adresu i kontaktów, które powinny zostać utworzone po utworzeniu restauracji. Zignorujmy wszystkie walidacje (od początku miałem je skomentowane). Kiedy używampo (: build), tworzona jest pierwsza restauracja, niż adres tworzony z identyfikatorem restauracji jakoid adresowalny i nazwa klasy jakotyp_adresowalny. To samo dotyczy kontaktów, wszystkie są poprawne. Problem polega na tym, że restauracja nie wie o nich (nie ma identyfikatorów adresu ani kontaktów), nie mogę uzyskać do nich dostępu z restauracji, którą chcę.