2009-06-08 15 views
7

この件に関する既存の質問/スレッドの多くを読んだことがありますが、はありません。そのうちのは私の問題に直接対処しています。また、これはでないことを覚えておいてください。 DB情報を事前に知らないので、database.ymlの状況です。実行中のアプリケーションでモデルをデータベースに動的に接続しますか?

つまり、私はDYNAMICALLYのRailsアプリで複数のデータベースに接続するための解決策が必要です。私の状況は、私は単純なデータテーブル(EVENTS、TIMESTAMP、VALUE)を持つ複数のデータロギングサイトを持っているということです。これらのサイトは、それらを使用する必要のあるローカルアプリケーションのためにそのまま残す必要があります。

"MYSQL_LOGINS"のテーブルを管理するアプリケーションを作成し、それらのログインを使用してさまざまなデータベースのいずれかに接続し、その中のデータのグラフ/グラフを提供するアプリケーションを作成する必要があります。

私の "データ"モデルは、私が接続するすべてのMySQLデータベースで同じままですが、私はMODELに別のDBに接続するように伝えるだけで済みます。私はこれが驚くほど簡単だと思っていますが、私たちは見ていきます。

答えて

14

あなたはActiveRecord::Base#establish_connectionが必要です。

class LogBase < ActiveRecord::Base 
    self.abstract_class = true 
end 

class LogItem < LogBase 
    ... 
end 

LogItem.establish_connection { ... } 

LogItem.find_by_ ... 

あなたしかその1つのモデルがあります場合:あなたはおそらく、手動接続を使用したモデルは、接続がアプリケーションの残りの部分で使用邪魔しないように抽象サブクラスでそれを使用したいと思います手動接続を行う場合、抽象クラスは不要です。

接続可能なデータベースの完全なセットを知っていますか?もしそうなら、database.ymlは依然としてあなたにとって役に立つかもしれません。重そう、かなりヘビー級とすることができる接続の設定

# database.yml 
atlanta: 
    host: atlantadb.foo.com 

# foo.rb 
LogItem.establish_connection :atlanta 

:あなたはその後、動的にそれらの名前を使用してアプリケーションにしてestablish_connectionするかを選択して、それぞれのデータベースに名前を与え、ディレクトリとしてそこにすべての情報を置くことができますサイトが広域ネットワークによって分離されている場合。私は、抽出 - 変換 - 負荷アプローチを使用し、毎時/毎日のcronジョブを使用してデータを集中レポートサイトにコピーする方が理にかなっているかどうかを検討します。これはデータウェアハウスの最も基本的な形式であり、非常に一般的に使用される方法です。 MySqlを使用している場合、Maatkit Syncはテーブル用のrsyncのようなきれいな小さなツールです。代わりに、マスタースレーブレプリケーションをサポートしているデータベースを使用しているかもしれませんが、これはメンテナンスがかなり複雑になる可能性があります。

+0

実際には、データベースに接続するだけのクラスを作成しました。それはうまくいくようです。残念なことに、いったんこれをデプロイすると、DBの「標準」セットはなくなります。単純にユーザーの要求に従います。また、データの性質上、「ウェアハウス」アプローチは機能しません。データのソースを示すためにログに記録されているデータが不十分であり、データの重複が発生する可能性があります。したがって、それぞれの「手動」接続は一時的であり、データの一時的な抽出(ただし、保持はできません)を可能にします。 優れたポストbtw。どうも。 –

0

Railsでは複数のデータベースをサポートしていません(誰も知っていることはありません)。 ActiveRecordのデータベース接続をどういうわけかそのモデルにハイジャックする必要があります。

Hereは、このためのアクティブなレコードのドキュメントです。ここには、オーバーライドする必要があるspecific documentationがあります。

Thisは実際にプロセスをよく説明するものです。

半製品対応のprojectsもこの問題を攻撃しています。