Frage

Im arbeitet an einer Legacy-Oracle-Datenbank mit einer etwas ungeradeen Tabellennamenskonvention, wobei jeder Spaltenname mit den Tabellen Anfangsbuchstabe vorangestellt ist - z. B. policy.poli_id

Um diese Datenbank zu erleichtern die Arbeit mit mir eine Methode set_column_prefix habe, die Zugriffsmethoden für jede Spalte mit dem Präfix entfernt erzeugt. dh:

# 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

Dies ist in einer Datei (insoft.rb) in meinem lib / Verzeichnis und benötigt aus meiner config / environment.rb nach dem Rails :: Initializer.run Block.

Dies wurde in der Entwicklung arbeitet gut, aber wenn ich versuche, die Anwendung im Produktionsmodus ausführen kann, ich die folgende Fehlermeldung in all meinen Modellen erhalten:

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

Dieser Fehler wird durch die 'config.cache_classes = true' Zeile in config / Umgebungen / production.rb ausgelöst. Wenn ich dies auf false , dann werden Schienen starten, wird aber nicht Klassen werden Caching. Ich vermute, dies macht Schienen-Cache alle Modelle, bevor sie den Initializer Block läuft

Wenn ich die ‚require„insoft.rb‘", um vor Beginn des Rails :: Initializer.run Block bewegen, dann bekomme ich Fehler, weil Active noch nicht initialisiert wurde:

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

Wo soll ich das benutzerdefinierte lib und set_column_prefix Methode sein, um auch für sie, bevor die Modelle zwischengespeichert werden abgeholt werden, aber nachdem alle Dateien Active geladen haben?

Prost

Dave Smylie

War es hilfreich?

Lösung

  

Wo soll ich das benutzerdefinierte lib und set_column_prefix Methode sein, um auch für sie, bevor die Modelle zwischengespeichert werden abgeholt werden, aber nachdem alle Active Dateien geladen?

Versuchen Sie, bis ein initializer . Sie können es nennen config / initializers / insoft.rb mit dem Inhalt Ihres Affen-Patch:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top