Rails コンソールが 2 番目の DB のモデルを自動的にロードしない
-
03-07-2019 - |
質問
実際のアプリケーション用の 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 はそのモデルを自動的にロードする方法を知りません。
他のヒント
実行時に他のデータベースへの接続を処理する職場のアプリ用に何かを書いたので、役立つかもしれません。