Auflösen eines Klassennamenskonflikts in einer Rails-Anwendung

7

Ich habe eine Rails-Anwendung erstellt, die Buchhaltungsfunktionen ausführt. Dazu habe ich ein Modell mit dem Klassennamen Transaction . So weit, so gut, ich habe diese Funktionalität für einen Monat oder so gebaut, und alles funktioniert wie erwartet.

Bis jetzt ...

Ich habe gerade einige ältere Reporting-Funktionen entdeckt, die vor Monaten entwickelt wurden, als die Ruport-Bibliothek nicht mehr funktionierte. Es scheint, dass Ruport beim Erzeugen von PDFs eine Bibliothek benötigt, die auch eine Klasse / Modul namens Transaction hat.

%Vor%

Also, ich bin auf der Suche nach einer schnellen Lösung hier. Eine, die hoffentlich nicht mein Transaction -Modell umbenennt und den Code der letzten paar Wochen neu gestaltet.

Ich freue mich auf einige clevere Vorschläge:)

    
aaronrussell 17.09.2010, 13:14
quelle

3 Antworten

7

Ich glaube, dass das Problem auf Ruport zurückzuführen ist, das das PDF :: Writer-Juwel benötigt, welches wiederum das Transaction :: Simple-Juwel erfordert, das das Modul Transaction definiert.

Es gibt sicherlich eine # transaction-Methode in ActiveRecord, aber ich glaube nicht, dass es ein Transaktionsmodul oder eine Klasse in Rails gibt. Ich bin froh, dass ich darüber korrigiert werde.

Namespacing ist normalerweise die beste Vorgehensweise, um Namenskonflikte wie diese zu vermeiden. Z.B.

%Vor%

Namespacing von ActiveRecord-Modellen kann jedoch andere Probleme verursachen.

So zeitaufwändig es auch sein mag, die Umbenennung Ihres Transaktionsmodells ist vielleicht die beste Wahl.

Sie können Ihre vorhandene Transaktionsdatenbanktabelle weiterhin beibehalten, wenn Sie möchten. Daher müssen sich Ihre Migrationen nicht ändern, indem Sie self.table_name = "transactions" in Ihr Modell einfügen.

Ihre Assoziationen mit anderen Modellen können auch weiterhin als "Transaktion (en)" bezeichnet werden, indem Sie den Klassennamen in Ihrem Assoziationsaufruf angeben. ZB

%Vor%

Diese beiden Vorschläge können Sie vielleicht etwas Zeit sparen.

    
Sidane 17.09.2010, 13:48
quelle
13

Schon beantwortet und alt, aber ich kam hier mit dem gleichen Problem, löste es aber auf andere Weise.

Ich habe zwei Modelle namens Pull und Query. Der Versuch, Query.some_static_method() innerhalb einer Pull-Methode zu referenzieren, führte zur Auflösung der Abfrage in ActiveRecord::AttributeMethods::Query:Module .

Sie haben es gelöst, indem Sie den leeren Namensraum mit ::Query.some_static_method()

davor gelegt haben     
hometoast 17.11.2010 15:32
quelle
0

Ihr Problem kann von der Tatsache herrühren, dass Transaktion auch ein reserviertes Wort in Rails ist ...

    
Yannis 17.09.2010 13:20
quelle