Carriles tema dependencias en el modo de producción
-
23-08-2019 - |
Pregunta
Im trabajando en una base de datos Oracle legado con una convención de nomenclatura mesa un poco extraño, donde cada nombre de columna es el prefijo de las tablas iniciales -. Ej policy.poli_id
Para hacer esta base de datos más fácil de trabajar que tengo una set_column_prefix método que crea descriptores de acceso para cada columna con el prefijo eliminado. es decir:
# 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
Esto está en un archivo (insoft.rb) en mi lib /, y requiere de la de mi config / environment.rb después de la Rieles :: Initializer.run bloque.
Esta bien ha estado trabajando en el desarrollo, pero cuando trato de ejecutar la aplicación en modo de producción, se produce el error siguiente en todos mis modelos:
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
Este error se desencadena por la 'config.cache_classes = true' línea en config / ambientes / production.rb. Si fijo a este false , a continuación, los carriles se pondrá en marcha, pero no será el almacenamiento en caché clases. Supongo que esto hace que los carriles caché de todos los modelos antes de que se ejecuta el bloque inicializador
Si muevo el 'requerir "insoft.rb'" para antes del inicio del bloque de rieles :: Initializer.run, entonces consigo errores debido a ActiveRecord no se ha inicializado aún:
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
¿Dónde debería estar incluida esta lib personalizada y el método set_column_prefix con el fin de que sea recogido antes de que los modelos están almacenados en caché, pero después de todos los archivos de ActiveRecord han cargado?
Saludos
David Smylie
Solución
¿Dónde debería estar incluida esta lib personalizada y el método set_column_prefix con el fin de que sea recogido antes de que los modelos se almacenan en caché, pero después de todos los archivos de ActiveRecord he cargado?
Trate de establecer un inicializador . Se le puede llamar config / inicializadores / insoft.rb con el contenido de su parche mono:
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