FactoryGirl in Rails - Verknüpfungen mit eindeutigen Einschränkungen

9

Diese Frage ist eine Erweiterung zu der hier aufgeworfenen:

Verwendung von factory_girl in Rails mit Assoziationen mit eindeutigen Einschränkungen. Erhalte doppelte Fehler

Die angebotene Antwort hat perfekt für mich gearbeitet. So sieht es aus:

%Vor%

Das Problem, das bei mir auftaucht, ist, wenn ich manuell eine Assoziation erstellen muss, um eine polymorphe Assoziation mit einer Eindeutigkeitseinschränkung in einem Hook zu unterstützen. Zum Beispiel:

%Vor%

Meine aktuelle Singleton-Implementierung unterstützt nicht den Aufruf von FactoryGirl::Singleton.execute(:matchup, :matchupable => bm) , nur FactoryGirl::Singleton.execute(:matchup) .

Wie empfehlen Sie, die Singleton-Factory zu ändern, um einen Aufruf wie FactoryGirl::Singleton.execute(:matchup, :matchupable => bm) OR FactoryGirl::Singleton.execute(:matchup) zu unterstützen?

Da der obige Code im Moment den Validierungsfehler für die Eindeutigkeit ("Ereignis ist bereits vergeben") jedes Mal auslöst, wenn der Hook auf factory ausgeführt wird: baseball_matchup. Letztendlich muss dies behoben werden dass es nicht mehr als ein Matchup oder baseball_matchup in der Datenbank gibt.

    
keruilin 13.03.2012, 04:26
quelle

3 Antworten

1

Sie müssen zwei Dinge tun, damit dies funktioniert:

  1. Übernehmen Sie Attribute als Argument Ihre execute Methode.
  2. Deaktivieren Sie sowohl den Werksnamen als auch die Attribute beim Erstellen der Singleton-Factorys.

Beachten Sie, dass Schritt 1 nicht ausreicht, um Ihr Problem zu lösen. Selbst wenn Sie execute erlauben, Attribute zu akzeptieren, wird der erste Aufruf von execute(:matchup, attributes) das Ergebnis zwischenspeichern und jedes Mal zurückgeben, wenn Sie execute(:matchup) haben, auch wenn Sie versuchen, verschiedene Attribute an execute zu übergeben. Deshalb müssen Sie auch das ändern, was Sie als Hash-Schlüssel für Ihren @@singletons Hash verwenden.

Hier ist eine Implementierung, die ich getestet habe:

%Vor%

Der Schlüssel ist eine Zeichenfolge, die aus dem Werksnamen und einer Abfragezeichenfolgedarstellung des Attributs hash besteht (etwas wie "matchup?event=6&matchupable=2" ). Ich war in der Lage, mehrere verschiedene Matchups mit unterschiedlichen Attributen zu erstellen, aber es respektierte die Einzigartigkeit des Ereignisses / der kombinierbaren Kombination.

%Vor%

Lassen Sie mich wissen, ob das für Sie nicht funktioniert.

    
Brandan 06.04.2012, 14:09
quelle
3

Wie zetetic bereits erwähnt hat, können Sie einen zweiten Parameter für Ihre Ausführungsfunktion definieren, um die Attribute, die während des Aufrufs an FactoryGirl.create verwendet werden sollen, mit einem Standardwert für einen leeren Hash zu senden, so dass keiner davon überschrieben wird in dem Fall, dass Sie es nicht verwenden (Sie müssen in diesem speziellen Fall nicht überprüfen, ob der Attribut-Hashwert leer ist).

Beachten Sie auch, dass Sie in diesem Fall keinen begin..end Block definieren müssen, da nach Ihrer Rettung nichts zu tun ist. Sie können also Ihre Methode vereinfachen, indem Sie die Rettung als Teil des. definieren Methodendefinition. Die Zuweisung für den Fall, dass die Initialisierung in Ordnung war, wird auch den zugewiesenen Wert zurückgeben, so dass es nicht notwendig ist, den Hash erneut explizit aufzurufen, um ihn zurückzugeben. Mit all diesen Änderungen endet der Code wie folgt:

%Vor%     
Carlos Paramio 30.03.2012 05:50
quelle
1

Ruby-Methoden können Standardwerte für Argumente haben. Definieren Sie daher Ihre Singleton-Methode mit einem leeren Standardoptions-Hash:

%Vor%

Jetzt können Sie es auf beide Arten aufrufen:

%Vor%

Testen Sie in der Methode den Optionsargument-Hash, um festzustellen, ob etwas übergeben wurde:

%Vor%     
zetetic 15.03.2012 00:48
quelle

Tags und Links