Question

Im travaillant sur une base de données oracle héritage avec une convention de nommage de table un peu bizarre où chaque nom de colonne est préfixé avec les tables initiales -. Par exemple policy.poli_id

Pour rendre cette base de données plus facile de travailler avec j'ai une set_column_prefix méthode qui crée des accesseurs pour chaque colonne avec le préfixe enlevé. à-dire:

# 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 le bloc Rails :: Initializer.run.

travaille 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:

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

Cette erreur est déclenchée par le 'config.cache_classes = true' ligne dans config / environnements / production.rb. Si je mets cela à false , puis rails commencera, mais ne sera pas mise en cache des classes. Je devine que ce qui rend les rails en cache tous les modèles avant d'exécuter le bloc Initializer

Si je déplace le « besoin « insoft.rb » à avant le début des rails :: bloc Initializer.run, je reçois des erreurs parce que ActiveRecord n'a pas encore été initialisé:

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 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é?

Vive

Dave Smylie

Était-ce utile?

La solution

  

Où dois-je inclurai cette méthode lib et set_column_prefix personnalisés afin qu'il soit pris avant que les modèles sont mises en cache, mais après tous les fichiers activerecord ont chargé?

Essayez la mise en place d'un initialiseur. 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top