質問

イムは、各列名がテーブル頭文字が付いている少し奇妙テーブルの命名規則と従来の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

このエラーは、設定/環境/ production.rbで「config.cache_classes = TRUE」線によってトリガされます。 私はの偽のにこれを設定すると、レールが起動しますが、クラスをキャッシュすることはありません。私は、これは、それが初期化子ブロックを実行する前にレールがすべてのモデルをキャッシュします推測している。

私はRailsの開始前に「「insoft.rb」を必要と」:: 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

ここで私はそれがモデルの前にピックアップされるようにするために、このカスタムlibとset_column_prefix方法を含めなければなりませんキャッシュされますが、すべてのActiveRecordのファイルがロードされた後?

乾杯

デーブSmylie

役に立ちましたか?

解決

  

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

初期化子を設定してください。あなたのモンキーパッチの内容を設定/初期化子/ 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top