2009-07-05 8 views
1

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

Répondre

2

Où dois-je inclurai 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é ?

Essayez d'installer un initializer. Vous pouvez l'appeler config/initializers/insoft.rb avec le contenu de votre patch de singe:

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 
+0

Merci les gars. Cela semble avoir réglé le problème. –

Questions connexes