Pergunta

Im trabalhando em um banco de dados legado oráculo com uma mesa um pouco estranho convenção de nomenclatura, onde cada nome de coluna é prefixado com as tabelas de letras iniciais -. Por exemplo policy.poli_id

Para fazer este banco de dados mais fácil trabalhar com Eu tenho um set_column_prefix método que cria acessores para cada coluna com o prefixo removido. ou seja:

# 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

Esta é em um arquivo (insoft.rb) no meu lib /, e exigiu a partir de minha config / environment.rb após o bloco Rails :: Initializer.run.

Este foi trabalhar bem em desenvolvimento, mas quando tento executar o aplicativo no modo de produção, eu recebo o seguinte erro em todos os meus 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 erro é desencadeada pela 'config.cache_classes = true' linha em config / environments / production.rb. Se eu definir isso para false , em seguida, o Rails irá iniciar-se, mas não vai ser cache classes. Eu estou supondo que isso faz com que os trilhos armazenar em cache todos os modelos antes de executar o bloco Initializer

Se eu mover o 'exigem "insoft.rb'" para antes do início do bloco Rails :: Initializer.run, então eu recebo erros porque ActiveRecord não foi inicializado ainda:

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

Onde eu deveria estar incluindo este lib personalizado e método set_column_prefix, a fim de que ele seja pego antes que as modelos são armazenados em cache, mas depois de todos os arquivos activerecord ter carregado?

Felicidades

Dave Smylie

Foi útil?

Solução

Onde eu deveria estar incluindo este lib personalizado e método set_column_prefix, a fim de que ele seja pego antes que as modelos são armazenados em cache, mas depois de todos os arquivos activerecord ter carregado?

Tente configurar um initializer . Você pode chamá-lo config / initializers / insoft.rb com o conteúdo do seu patch macaco:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top