Fabrikmädchen mit polymorpher Assoziation für has_many und has_one

Ich arbeite derzeit an einem Projekt und wollte Tests mit Factory Girl erstellen, aber ich bin nicht in der Lage, es mit der polymorphen has_many-Assoziation zum Laufen zu bringen. Ich habe viele verschiedene Möglichkeiten ausprobiert, die in anderen Artikeln erwähnt wurden, aber es funktioniert immer noch nicht. Mein Modell sieht so aus:

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

Aus diesem Grund möchte ich eine Fabrik für das Restaurant mit Adressen und Kontakten erstellen (mit Validierungen für das Restaurant, aber wenn dies nicht möglich ist, auch ohne diese), kann dies aber nicht. Die endgültige Syntax sollte wie folgt aussehen:

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

Welches sollte auch zugehörige Adresse und Kontakte erstellen. Ich habe viele Artikel gelesen, bekomme aber immer eine Art Fehler. Momentan sind meine Fabriken (Sequenzen sind korrekt definiert) wie folgt:

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

Gibt es eine Möglichkeit, ein Restaurant mit einem Befehl im Test mit festgelegten Adressen und Kontakten zu erstellen? Muss ich meine Überprüfungen wegen After (: create) Callback wirklich loswerden? Aktueller Stand ist wie folgt:

Restaurant wird mit Name und ID erstellt.Als die Adresse erstellt wird, sind alle Werte korrekt, einschließlich addressable_id und addressable_typeDanach werden alle Kontakte geknüpft, wieder ist alles in Ordnung, cntacts hat die richtigen Werte.Danach hat das Restaurant keine IDs von zugeordneten Objekten, keine Zuordnung zu Adressen oder KontaktenDanach wird das Restaurant aus irgendeinem Grund neu aufgebaut (vielleicht um diese Assoziationen hinzuzufügen?) Und es schlägt fehl: Ich erhalte ActiveRecord: RecordInvalid.

Ich benutze factory_girl_rails 4.3.0, Ruby 1.9.3 und Rails 4.0.1. Ich freue mich über jede Hilfe.

UPDATE 1:

Nur zur Verdeutlichung meines Ziels möchte ich in der Lage sein, ein Restaurant in meiner Spezifikation mit einem einzigen Befehl zu erstellen und auf zugehörige Adressen und Kontakte zuzugreifen, die bei der Erstellung des Restaurants erstellt werden sollten. Lassen Sie uns alle Validierungen ignorieren (ich habe sie in meinem Beispiel von Anfang an auskommentieren lassen). Wenn ich benutzenachher (: build), wird das erste Restaurant erstellt, dann wird die Adresse mit der ID des Restaurants als erstelltaddressable_id und Klassenname alsaddressable_type. Gleiches gilt für Kontakte, alle sind korrekt. Das Problem ist, dass das Restaurant nichts über sie weiß (es hat keine IDs von Adressen oder Kontakten). Ich kann von dem Restaurant, auf das ich zugreifen möchte, nicht auf sie zugreifen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage