2010-09-17 12 views
7

Ho creato un'applicazione Rails che esegue la funzionalità di contabilità. Come parte di questo, ho un modello con il nome della classe Transaction. Fin qui tutto bene, ho costruito questa funzionalità per un mese o giù di lì, e tutto funziona come previsto.Risoluzione di un conflitto di nome classe in un'applicazione Rails

Fino ad ora ...

Ho appena scoperto alcune funzionalità di reporting più vecchio che è stato sviluppato mesi fa utilizzando la libreria Ruport ha smesso di funzionare. Sembra che Ruport, quando genera PDF, richieda una libreria che abbia anche una classe/modulo chiamato Transaction.

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

... 

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

Quindi, sto cercando una soluzione rapida qui. Uno che, auspicabilmente, non comporta la ridenominazione del mio modello Transaction e il refactoring delle ultime settimane di codice.

In attesa di alcuni suggerimenti intelligenti :)

risposta

7

Credo che il problema è giù per Ruport che richiede il PDF :: Writer gem, che a sua volta richiede la gemma Transaction :: Simple che definisce il modulo Transaction.

C'è sicuramente un metodo #transaction in ActiveRecord, ma non penso che ci sia un modulo Transaction o una classe all'interno di Rails. Sarò felice di essere corretto su quello.

Il namespace è in genere la procedura migliore per evitare conflitti di denominazione come questo. Per esempio.

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

Tuttavia, i modelli di ActiveRecord di namespace possono generare altri problemi.

Per quanto possa essere il tempo, rinominare il modello di transazione potrebbe essere la soluzione migliore.

È ancora possibile mantenere la tabella del database delle transazioni esistente se si desidera, quindi le migrazioni non devono essere modificate, inserendo self.table_name = "transactions" all'interno del modello.

Le associazioni con altri modelli possono anche essere denominate "transazione (i)" specificando il nome_classe nella chiamata di associazione. Per esempio.

class User < ActiveRecord::Base 

    has_many :transactions, :class_name => "AccountTransaction" 

end 

Questi due suggerimenti possono o meno risparmiare tempo.

+0

Grazie. Ho cambiato la risposta alla risposta accettata in quanto descrive più accuratamente il problema specifico che ho - anche se Yannis, la risposta è corretta! Alla fine ho fatto ricorso a rinominare il mio modello, la tabella del database e tutte le associazioni utilizzando alcune ricerche e sostituzioni precedenti;) – aaronrussell

+0

Nella versione più recente di Rails, 'set_table_name' è semplicemente' self.table_name = ', vedere http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-table_name-3D –

0

Il tuo problema potrebbe venire dal fatto che la transazione è anche una parola riservata in Rails ...

+0

è vero? Dannazione! Ma grazie per avermi informato ... – aaronrussell

+4

Rails è solo una libreria Ruby, non può aggiungere parole chiave al linguaggio Ruby. –

+1

Potrebbe essere solo una libreria, ma può imporre limiti sulla denominazione delle cose che la utilizzano (anche se queste non sono applicate dal linguaggio).Dai un'occhiata al problema che ti capita quando provi ad usare il nome della colonna 'tipo' ... –

13

Già risposto e vecchio, ma sono venuto qui con lo stesso problema, ma l'ho risolto in un modo diverso.

Ho due modelli denominati Pull e Query. Provare a fare riferimento a Query.some_static_method() all'interno di un metodo in Pull ha comportato la risoluzione della query su ActiveRecord::AttributeMethods::Query:Module.

risolto mettendo lo spazio dei nomi vuoto di fronte ad essa con ::Query.some_static_method()

+0

Bella risposta, non sapevo del namespace vuoto! –

+0

Soluzione elegante. Potresti spiegare esattamente perché/come funziona? – cph2117

+0

@ cph2117, tutto ciò che realmente fa è essere espliciti su quale spazio dei nomi deve trovare 'Query'. – hometoast

Problemi correlati