7 Stimmen

Auflösen eines Klassennamenskonflikts in einer Rails-Anwendung

Ich habe eine Rails-Anwendung gebaut, die Buchhaltungsfunktionen ausführt. Als Teil dieser Anwendung 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 festgestellt, dass einige ältere Berichtsfunktionen, die vor Monaten mit der Ruport-Bibliothek entwickelt wurden, nicht mehr funktionieren. Es scheint, dass Ruport beim Erzeugen von PDFs eine Bibliothek benötigt, die auch eine Klasse/ein Modul namens Transaction .

TypeError in Admin/team reportsController#generate
Transaction is not a module

...

This error occurred while loading the following files:
  pdf/writer
  transaction/simple

Ich bin also auf der Suche nach einer schnellen Lösung. Eine, die hoffentlich nicht die Umbenennung meiner Transaction Modells und die Überarbeitung des Codes der letzten paar Wochen.

Ich freue mich auf ein paar clevere Vorschläge :)

15voto

hometoast Punkte 11253

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

Ich habe zwei Modelle namens Pull und Query. Ich versuche zu referenzieren Query.some_static_method() innerhalb einer Methode in Pull führte dazu, dass Query sich auflöste in ActiveRecord::AttributeMethods::Query:Module .

Ich habe das Problem gelöst, indem ich den leeren Namespace vorangestellt habe mit ::Query.some_static_method()

8voto

Sidane Punkte 2101

Ich glaube, das Problem liegt daran, dass Ruport das PDF::Writer-Gem benötigt, das wiederum das Transaction::Simple-Gem benötigt, das das Modul Transaction definiert.

Es gibt zwar eine #transaction-Methode in ActiveRecord, aber ich glaube nicht, dass es ein Transaktionsmodul oder eine Transaktionsklasse in Rails gibt. Ich freue mich, wenn ich in diesem Punkt korrigiert werde.

Namespacing ist in der Regel die beste Praxis zur Vermeidung von Namenskonflikten wie diesem. z.B.

module Account
  class Transaction < ActiveRecord::Base
    ....
  end
end 

Das Namespacing von ActiveRecord-Modellen kann jedoch zu anderen Problemen führen.

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

Sie können Ihre bestehende Transaktionsdatenbanktabelle beibehalten, so dass Ihre Migrationen nicht geändert werden müssen, indem Sie self.table_name = "transactions" innerhalb Ihres Modells.

Ihre Assoziationen mit anderen Modellen können auch weiterhin "Transaktion(en)" genannt werden, indem Sie den class_name in Ihrem Assoziationsaufruf angeben. Z.B..

class User < ActiveRecord::Base

  has_many :transactions, :class_name => "AccountTransaction"

end

Diese beiden Vorschläge können Ihnen Zeit ersparen, müssen es aber nicht.

1voto

Yannis Punkte 5376

Ihr Problem kann von der Tatsache kommen, dass Transaction auch ein reserviertes Wort in Rails ist

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X