質問

実際のアプリケーション用の 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とは 回避策?
役に立ちましたか?

解決

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

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

他のヒント

実行時に他のデータベースへの接続を処理する職場のアプリ用に何かを書いたので、役立つかもしれません。

http://github.com/cherring/connection_ninja

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top