実行中のアプリのモデルをデータベースに動的に接続しますか?
-
12-09-2019 - |
質問
私はこの主題に関する既存の質問/スレッドの多くを読みましたが、それを覚えておいてください なし それらのうち、私の問題に直接対処しました。また、これはそうであることに留意してください いいえ 私は事前にDB情報がわからないので、database.ymlの状況。
とはいえ、私は解決策が必要です 動的に Railsアプリ内の複数のデータベースに接続します。私の状況では、すべてのデータテーブル(イベント、タイムスタンプ、値)がある複数のデータロギングサイトがあります。これらのサイトは、それらを使用する必要があるローカルアプリケーションが原因であるため、維持する必要があります(およびする必要があります)。
必要なのは、「mysql_logins」のテーブルを維持し、それらの各ログインを使用してさまざまなデータベースのいずれかに接続し、そのデータにチャート/グラフを提供するアプリケーションを作成することです。
私の「データ」モデルは、私が接続するすべてのMySQLデータベースで同じままです。単に、モデルに別のDBに接続するように指示できる必要があります。これが驚くほど簡単であることを願っていますが、わかります。
解決
あなたが欲しい ActiverCord :: Base#Enditish_Connection. 。おそらく、手動接続を使用したモデルがアプリケーションの残りの部分での接続の使用を妨げないように、抽象サブクラスで使用することをお勧めします。
class LogBase < ActiveRecord::Base
self.abstract_class = true
end
class LogItem < LogBase
...
end
LogItem.establish_connection { ... }
LogItem.find_by_ ...
手動接続を行うモデルが1つだけある場合、抽象クラスは不要です。
接続できるデータベースの完全なセットを知っていますか?もしそうなら、データベース.ymlはあなたにとってまだ役立つかもしれません。すべての情報をディレクトリとしてそこに配置し、各データベースに名前を付けることができます。次に、それらの名前を使用してアプリケーションで_Connectionを設定するために動的に選択します。
# database.yml
atlanta:
host: atlantadb.foo.com
# foo.rb
LogItem.establish_connection :atlanta
接続のセットアップは非常にヘビー級である可能性があるため、サイトが広いエリアネットワークで分離されている場合。抽出トランスフォームロードアプローチを使用し、1時間/毎日のCronジョブを使用して集中型レポートサイトにデータをコピーする方が理にかなっているかどうかを考えます。これはデータウェアハウスの最も基本的な形式であり、非常に一般的に使用されるアプローチです。 mysqlを使用している場合、 Maatkit Sync テーブル用のrsyncのようなきちんとした小さなツールです。あるいは、おそらくマスタースレーブレプリケーションをサポートするデータベースを使用しますが、メンテナンスはかなり複雑になる可能性があります。