Domanda

Im lavorando su un database legacy Oracle con un tavolo un po 'strana convenzione di denominazione in cui ogni nome di colonna è preceduto con le tabelle iniziali -. Ad es policy.poli_id

Per rendere questo database più facile lavorare con Ho un metodo set_column_prefix che crea funzioni di accesso per ogni colonna con il prefisso rimosso. vale a 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

Questo è in un file (insoft.rb) nella mia lib / directory, e richiesto dal dal mio config / environment.rb dopo il blocco Rails :: Initializer.run.

Questo raffinato ha lavorato in fase di sviluppo, ma quando provo ad eseguire l'applicazione in modalità di produzione, ho l'errore seguente in tutti i miei modelli:

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

Questo errore è innescata dalla 'config.cache_classes = true' linea in config / ambienti / production.rb. Se ho impostato questo per false , quindi le rotaie si avvia, ma non saranno caching classi. Sto indovinando questo rende le rotaie nella cache tutti i modelli prima di eseguire il blocco Initializer

Se mi muovo il 'richiedere "insoft.rb'" per prima dell'inizio del blocco Rails :: Initializer.run, allora ottengo errori perché ActiveRecord non è stato ancora inizializzato:

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

Dove dovrei essere compreso questo lib costume e metodo set_column_prefix in modo che esso per essere ritirata prima che i modelli sono memorizzati nella cache, ma dopo tutti i file di ActiveRecord hanno caricato?

Saluti

Dave Smylie

È stato utile?

Soluzione

  

Dove dovrei essere compreso questo lib costume e metodo set_column_prefix in modo che esso per essere ritirata prima che i modelli sono memorizzati nella cache, ma dopo tutti i file di ActiveRecord ho caricato?

Prova la creazione di un initializer . Si può chiamare config / inizializzatori / insoft.rb con il contenuto della patch di scimmia:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top