1

各列名の前にテーブルの頭文字が付いている、少し奇妙なテーブル命名規則を使用して、従来のOracleデータベースで作業しています(例:policy.poli_id)。

このデータベースを使いやすくするために、プレフィックスを削除して各列のアクセサーを作成するメソッド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から必要です。

これは開発では正常に機能していますが、アプリケーションを本番モードで実行しようとすると、すべてのモデルで次のエラーが発生します。

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

このエラーは、config / environment/production.rbの「config.cache_classes=true」行によってトリガーされます。これをfalseに設定すると、railsは起動しますが、クラスをキャッシュしません。これにより、RailsがInitializerブロックを実行する前にすべてのモデルをキャッシュするようになると思います

'require"insoft.rb'"をRails::Initializer.runブロックの開始前に移動すると、ActiveRecordがまだ初期化されていないため、エラーが発生します。

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

モデルがキャッシュされる前に、すべてのactiverecordファイルがロードされた後にピックアップされるようにするには、このカスタムlibおよびset_column_prefixメソッドをどこに含める必要がありますか?

乾杯

デイブ・スマイリー

4

1 に答える 1

2

モデルがキャッシュされる前に、すべてのactiverecordファイルがロードされた後にピックアップされるようにするには、このカスタムlibおよびset_column_prefixメソッドをどこに含める必要がありますか?

イニシャライザを設定してみてください。モンキーパッチの内容を使用して、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
于 2009-07-05T21:43:17.813 に答える