Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-01-08

Magic Multi-Connections をつかって、ひとつの Rails アプリから複数のデータベースを利用する

|   Magic Multi-Connections をつかって、ひとつの Rails アプリから複数のデータベースを利用する - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -   Magic Multi-Connections をつかって、ひとつの Rails アプリから複数のデータベースを利用する - KazusaAPI開発日誌   Magic Multi-Connections をつかって、ひとつの Rails アプリから複数のデータベースを利用する - KazusaAPI開発日誌 のブックマークコメント

ActiveRecord はひとつのデータベースコネクションだけしか持てないけど、 no title をつかうと複数のデータベースコネクションを一つの Rails アプリで扱うことが出来る。

同一ホストにある MySQL のデータベース同士なら、モデルに set_table_name "alternativedb.table_name" というようにすると別のデータベースにアクセスできるが、この方法ではホストの異なるアクセスは不可能である。

目的

アプリ(AppA)からほかのアプリ(AppB)にあるユーザアカウント情報を使いたい。

方法

Magic Multi-Connections を gem でインストールする。

AppB のデータベースが localhost の MySQL の appb_production の場合、AppA/config/database.yml に AppB のデータベースのコネクション情報を追加する。

appb_db:
  adapter: mysql
  user: user
  password: pass
  database: appb_production
  host: localhost 

AppBのアカウント情報のモデルを追加する。AppA/app/models/account.rb を AppA/app/models/appb/account.rbにコピー。ここの models/appb/account.rb は AppB::Account に相当する。

AppA/config/environment.rb に AppB のデータベースの接続情報を追加する。

require 'magic_multi_connections'

module AppB
  establish_connection :appb_db
end

script/console で確認する。AppB モジュール付きのモデルは appb_db に接続する。

>> AppB::Account.find(:all)

まとめ

  1. Magic Multi-Connections をつかった複数のデータベースの利用をおこなった
  2. モデルのファイル名規約は便利
  3. 設定情報を共有したいときに便利かも

バッキーバッキー2008/02/23 09:34> AppBのアカウント情報のモデルを追加する。
> AppA/app/models/account.rb を
> AppA/app/models/appb/account.rbにコピー。
> ここの models/appb/account.rb は AppB::Account に相当する。

Magic Multi-Connections 1.2.1 で実験してみました。
上記モデルのコピーは必要ないようです。
むしろ「ppA/app/models/account.rb 」が存在することが必須でした。
これはAppAのデータベース側にテーブルの実体が存在する、しないにかかわらず必要でした。
ですからAppAのデータベースとAppBのデータベースに同じテーブルが存在する場合は、同じ定義である事が望ましいようです。

トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20080108