2009-07-05 6 views
1

Ich arbeite an einer älteren Oracle-Datenbank mit einer leicht ungeraden Tabellenbenennungskonvention, bei der jedem Spaltennamen die Anfangsbuchstaben der Tabellen vorangestellt werden - zB policy.poli_id.Fehler bei der Rails-Abhängigkeit im Produktionsmodus

Um die Arbeit mit dieser Datenbank zu erleichtern, habe ich eine Methode set_column_prefix, die Accessoren für jede Spalte mit dem Präfix entfernt erstellt. dh:

# 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 

Dies ist in einer Datei (insoft.rb) in meinem lib/Verzeichnis und benötigt aus meiner config/environment.rb nach dem Rails :: Initializer.run Block.

Dies hat gearbeitet in der Entwicklung gut, aber wenn ich versuche, die Anwendung im Produktionsmodus ausführen, bekomme ich die folgende Fehlermeldung in allen meinen Modellen:

[email protected]:~/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 

Dieser Fehler wird ausgelöst durch die ‚config .cache_classes = true 'Zeile in config/environments/production.rb. Wenn ich dies auf false einstelle, dann werden Rails gestartet, aber nicht Caching-Klassen. Ich nehme an, das macht Rails Cache alle Modelle, bevor es den Initialisierer Block

läuft Wenn ich die 'require "insoft.rb'" vor dem Start des Rails :: Initializer.run Block, dann bekomme ich

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 

Wo soll ich das benutzerdefinierte lib und set_column_prefix Methode, um sie vor den Modellen werden zwischengespeichert abgeholt werden, einschließlich, aber nachdem alle Active Dateien geladen: Fehler, weil Active wurde noch nicht initialisiert ?

Prost

Dave Smylie

Antwort

2

Wo soll ich diesen Brauch lib und set_column_prefix Methode sein, um auch für sie, bevor die Modelle werden zwischengespeichert abgeholt werden, aber nachdem alle Active Dateien geladen ?

Versuchen Sie, einen initializer einzurichten. Du kannst es config/initializers/insoft.rb mit dem Inhalt deines Affen-Patches nennen:

+0

Danke Leute. Das scheint das Problem behoben zu haben. –

Verwandte Themen