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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top