Rails Abhängigkeiten Problem, wenn im Produktionsmodus
-
23-08-2019 - |
Frage
Im arbeitet an einer Legacy-Oracle-Datenbank mit einer etwas ungeradeen Tabellennamenskonvention, wobei jeder Spaltenname mit den Tabellen Anfangsbuchstabe vorangestellt ist - z. B. policy.poli_id
Um diese Datenbank zu erleichtern die Arbeit mit mir eine Methode set_column_prefix habe, die Zugriffsmethoden für jede Spalte mit dem Präfix entfernt erzeugt. 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 wurde in der Entwicklung arbeitet gut, aber wenn ich versuche, die Anwendung im Produktionsmodus ausführen kann, ich die folgende Fehlermeldung in all meinen Modellen erhalten:
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
Dieser Fehler wird durch die 'config.cache_classes = true' Zeile in config / Umgebungen / production.rb ausgelöst. Wenn ich dies auf false , dann werden Schienen starten, wird aber nicht Klassen werden Caching. Ich vermute, dies macht Schienen-Cache alle Modelle, bevor sie den Initializer Block läuft
Wenn ich die ‚require„insoft.rb‘", um vor Beginn des Rails :: Initializer.run Block bewegen, dann bekomme ich Fehler, weil Active noch nicht initialisiert wurde:
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 sein, um auch für sie, bevor die Modelle zwischengespeichert werden abgeholt werden, aber nachdem alle Dateien Active geladen haben?
Prost
Dave Smylie
Lösung
Wo soll ich das benutzerdefinierte lib und set_column_prefix Methode sein, um auch für sie, bevor die Modelle zwischengespeichert werden abgeholt werden, aber nachdem alle Active Dateien geladen?
Versuchen Sie, bis ein initializer . Sie können es nennen config / initializers / insoft.rb mit dem Inhalt Ihres Affen-Patch:
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