Im travaillant sur une base de données Oracle Oracle avec une convention de dénomination de table légèrement différente, où chaque nom de colonne est préfixé avec les lettres initiales des tables, par exemple policy.poli_id. Pour faciliter le travail de cette base de données, j'ai une méthode set_column_prefix qui crée des accesseurs pour chaque colonne avec le préfixe supprimé. à savoir:Problème de dépendances Rails en mode production
# 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
Ceci est dans un fichier (insoft.rb) dans mon répertoire lib/et nécessaire à partir de ma config/environment.rb après Rails :: bloc Initializer.run.
Cela a fonctionné très bien dans le développement, mais lorsque je tente d'exécuter l'application en mode de production, je reçois l'erreur suivante dans tous mes modèles:
[email protected]:~/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
Cette erreur est déclenchée par la « config .cache_classes = true 'ligne dans config/environments/production.rb. Si je le mets à faux, alors les rails démarreront, mais ne seront pas des classes de mise en cache. Je suppose que cela rend les rails cache tous les modèles avant qu'il ne commence le bloc Initializer
Si je déplace le 'require' insoft.rb '"avant le début du bloc Rails :: Initializer.run, alors je reçois erreurs car ActiveRecord n'a pas encore été initialisée:
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
Où dois-je inclurons cette lib personnalisé et la méthode de set_column_prefix afin qu'il soit pris avant que les modèles sont mises en cache, mais après tous les fichiers activerecord ont chargé ?
Vive
Dave Smylie
Merci les gars. Cela semble avoir réglé le problème. –