1. ホーム
  2. ruby-on-rails

Rails 3.1と複数のデータベースを接続する

2023-10-22 07:58:57

質問

ShowNearby では、PHP から RoR 3.1 への非常に大きな移行を行っていますが、いくつかの問題に直面しています。

私たちは大量のデータを持っており、DB をいくつかの DB に分離し、別々に処理できるようにすることにしました。たとえば、私たちのアカウント、場所、ログ、およびその他は、いくつかのデータベースに分割されています。

私たちは、マイグレーション、フィクスチャ、モデルをうまく動作させる必要がありますが、これまでのところ、かなり厄介なことになっています。許容できるソリューションに対する私たちの要求の一部です。

  • 1つのモデルは、1つのデータベースの1つのテーブルに関連している必要があります。
  • rake db:drop - database.yml で指定した全てのデータベース環境を削除します。
  • rake db:create - database.yml で指定したすべてのデータベースの環境を作成する
  • rake db:migrate - 様々なデータベースへのマイグレーションを実行する。
  • rake db:test - フィクスチャを取得して様々なデータベースに落とし込み、ユニットや関数などをテストする。

各データベースごとに別々のrailsプロジェクトを設定し、ActiveResourceで接続することを検討していますが、これはあまり効率的ではないように感じています。同じような問題に対処したことのある方はいらっしゃいますか?

どのように解決しましたか?

Wukerplankさんの回答ですが、通常通りdatabase.ymlに接続の詳細を以下のような名前で記述することも可能です。

log_database_production:
  adapter: mysql
  host: other_host
  username: logmein
  password: supersecret
  database: logs

次に、特殊なモデルで

class AccessLog < ActiveRecord::Base
  establish_connection "log_database_#{Rails.env}".to_sym
end

アプリケーションのコードに厄介なクレデンシャルが入らないようにするため。

編集してください。 この接続を複数のモデルで再利用したい場合、接続はクラスと密結合しているので、新しい抽象クラスを作成し、それを継承する必要があります(説明したように ここで , ここ そして ここ を参照)、各クラスごとに新しい接続が作成されます。

その場合は、このように設定します。

class LogDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "log_database_#{Rails.env}".to_sym
end

class AccessLog < LogDatabase
end

class CheckoutLog < LogDatabase
end