Rotaie problema dipendenze quando in modalità di produzione
-
23-08-2019 - |
Domanda
Im lavorando su un database legacy Oracle con un tavolo un po 'strana convenzione di denominazione in cui ogni nome di colonna è preceduto con le tabelle iniziali -. Ad es policy.poli_id
Per rendere questo database più facile lavorare con Ho un metodo set_column_prefix che crea funzioni di accesso per ogni colonna con il prefisso rimosso. vale a dire:
# Taken from wiki.rubyonrails.org/rails/pages/howtouselegacyschemas
class << ActiveRecord::Base
def set_column_prefix(prefix)
column_names.each do |name|
next if name == primary_key
if name[/#{prefix}(.*)/e]
a = $1
define_method(a.to_sym) do
read_attribute(name)
end
define_method("#{a}=".to_sym) do |value|
write_attribute(name, value)
end
define_method("#{a}?".to_sym) do
self.send("#{name}?".to_sym)
end
end
end
end
end
Questo è in un file (insoft.rb) nella mia lib / directory, e richiesto dal dal mio config / environment.rb dopo il blocco Rails :: Initializer.run.
Questo raffinato ha lavorato in fase di sviluppo, ma quando provo ad eseguire l'applicazione in modalità di produzione, ho l'errore seguente in tutti i miei modelli:
dgs@dgs-laptop:~/code/voyager$ RAILS_ENV=production script/server
=> Booting Mongrel
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1964:in `method_missing':
undefined method `set_column_prefix' for #<Class:0xb3fb81d8> (NoMethodError)
from /home/dgs/code/voyager/app/models/agent.rb:16
Questo errore è innescata dalla 'config.cache_classes = true' linea in config / ambienti / production.rb. Se ho impostato questo per false , quindi le rotaie si avvia, ma non saranno caching classi. Sto indovinando questo rende le rotaie nella cache tutti i modelli prima di eseguire il blocco Initializer
Se mi muovo il 'richiedere "insoft.rb'" per prima dell'inizio del blocco Rails :: Initializer.run, allora ottengo errori perché ActiveRecord non è stato ancora inizializzato:
usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant': uninitialized constant ActiveRecord (NameError)
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing'
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing'
from /home/dgs/code/voyager/lib/insoft.rb:1
Dove dovrei essere compreso questo lib costume e metodo set_column_prefix in modo che esso per essere ritirata prima che i modelli sono memorizzati nella cache, ma dopo tutti i file di ActiveRecord hanno caricato?
Saluti
Dave Smylie
Soluzione
Dove dovrei essere compreso questo lib costume e metodo set_column_prefix in modo che esso per essere ritirata prima che i modelli sono memorizzati nella cache, ma dopo tutti i file di ActiveRecord ho caricato?
Prova la creazione di un initializer . Si può chiamare config / inizializzatori / insoft.rb con il contenuto della patch di scimmia:
class << ActiveRecord::Base
def set_column_prefix(prefix)
column_names.each do |name|
next if name == primary_key
if name[/#{prefix}(.*)/e]
a = $1
define_method(a.to_sym) do
read_attribute(name)
end
define_method("#{a}=".to_sym) do |value|
write_attribute(name, value)
end
define_method("#{a}?".to_sym) do
self.send("#{name}?".to_sym)
end
end
end
end
end