2009-07-05 3 views
1

古い名前のOracleデータベースでは、各カラム名の先頭に文字列(例:policy.poli_id)が付いています。プロダクションモードのときにRailsの依存関係の問題が発生しました

このデータベースを使いやすくするために、接頭辞を削除した各列のアクセサを作成するメソッドset_column_prefixがあります。すなわち:

# 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 

これは私のlib /ディレクトリにあるファイル(insoft.rb)であり、およびRails :: Initializer.runブロックの後に、私のconfig/environment.rbにからから必要。

これは、開発中の細かい作業をされてきたが、私は本番モードでアプリケーションを実行しようとすると、私は私のモデルのすべてで次のエラーを取得する:

[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 

このエラーは、「設定によってトリガされますconfig/environments/production.rbの.cache_classes = true '行にあります。 に設定すると、レールが起動しますが、クラスはキャッシュされません。私はこれがイニシャライザブロックを実行する前にすべてのモデルをキャッシュすると思います。

Rails :: Initializer.runブロックの開始前に 'require "insoft.rb'"を移動すると、エラーActiveRecordのは、まだ初期化されていないので、私はモデルがキャッシュされる前に、それがピックアップされるが、すべてのActiveRecordのファイルをロードした後ためにこのカスタムlibとset_column_prefix方法を含めなければなりません

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 

乾杯

デイブSmylie私はモデルがキャッシュされる前に、それがピックアップされるようにするためで、このカスタムlibとset_column_prefix方法を含むべきであるが、すべてのActiveRecordのファイルをロードした後

答えて

2

initializerを設定してください。 config/initializers/insoft.rbをサルパッチの内容で呼び出すことができます:

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

ありがとうございます。それは問題を修正したようです。 –

関連する問題