Rails dependências emitir quando no modo de produção
-
23-08-2019 - |
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
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