1

実際のアプリケーション用の Postgres データベースを持つ Rails プロジェクトがありますが、Oracle データベースから大量のデータを引き出す必要があります。

database.yml は次のようになります

development:
  adapter: postgresql
  database: blah blah
  ...

oracle_db:
  adapter: oracle
  database: blah blah

Oracle DBのデータから派生した私のモデルは次のようになります

class LegacyDataClass < ActiveRecord::Base

  establish_connection "oracle_db"

  set_primary_key :legacy_data_class_id

  has_one :other_legacy_class, :foreign key => :other_legacy_class_id_with_funny_column_name

 ...
end

さて、習慣により、私は初期の開発 (これが初期の開発です) の多くを、少しコーディングしてから Rails コンソールで遊ぶことによって行うことがよくあります。たとえば、LegacyDataClass のすべての関連付けを定義した後、次のようなことを試してみますa = LegacyDataClass.find(:first); puts a.some_association.name。予期せず、これは LegacyDataClass がまだロードされていない状態で終了します。

require 'LegacyDataClass'その後、必要になるまで問題を修正できますがreload!、実際にはリロードされないか、コンソールの新しいインスタンスを開くまでです。

したがって、質問:

  • なぜこれが起こるのですか?明らかに、私が理解していない Rails マジックがいくつかあります。
  • Railsの便利な回避策は何ですか?
4

2 に答える 2

3

これは、接続ではなく、モデル名に関係していると思います。Rails の規則では、モデル クラス名は CamelCase であり、それらが存在するファイルは小文字 + アンダースコアです。

したがって、「LegacyModel」クラスは にあるはずですmodels/legacy_model.rb。あなたの声明"require 'LegacyDataClass'"は、これが当てはまらないことを示しているため、Rails はそのモデルを自動的にロードする方法を知りません。

于 2008-10-02T05:24:56.700 に答える
1

実行時に他のデータベースへの接続を処理する作業中のアプリのために何かを書きましたが、役立つかもしれません。

http://github.com/cherring/connection_ninja

于 2009-08-04T03:22:50.770 に答える