元の質問のコメントで kwon が示唆しているように、ユーザーの ID を保持するためだけにセッションを使用してアプローチします。次に、モデル内のロジックと、ユーザーの詳細とユーザー接続情報を保持する中央データベース (デフォルトの Rails DB) から目的のデータベース接続を取得します。
ユーザー モデルの変更から始めます (ユーザーが中央データベースに保持されているモデルを持っていると仮定します)。
- 使用するデータを表す属性をユーザーに追加します
- アプリケーションコントローラーで、セッションキーに基づいて before_filter でユーザーを設定します
- ユーザー引数で Stuff モデルを初期化します
その後、database.yml に基づいてデータベース接続を検索できます。または、ユーザーごとに 1 つのデータベースがあり、これを動的にする必要がある場合は、ユーザー モデルへの外部キーを使用してデータベース接続を表す 2 つ目のモデル (中央データベース内) を作成します。
以下は、実際には機能する場合と機能しない場合がある一連のコードですが、うまくいけば、開始するためのテンプレートが得られます。
class ApplicationController < ActionController::Base
before_filter :set_user
def set_user
begin
@user = UserProfile.find(session[:usernumber]) if session[:usernumber]
rescue
logger.warn "Possible error in set_user. Resetting session: #{$!}"
@user=nil
session[:usernumber]=nil
reset_session
end
end
end
class StuffController < ApplicationController
def show
@stuff = Stuff.user_get(@user, params[:id])
end
end
class Stuff < ActiveRecord::Base
# This would be better moved to a module to reuse across models
def self.establish_connection_user(user)
establish_connection(user.connection_hash)
end
def establish_connection_user(user)
establish_connection(user.connection_hash)
end
def self.user_get user, item_id
establish_connection_user(user)
find(id)
end
def self.user_where user, *query_args
establish_connection_user(user)
where(query_args)
end
# Even better than replicating 'where', create model methods
# that are more representative of your desired functionality
end
class User < ActiveRecord::Base
has_one :user_connection
def connection_hash
uc = self.user_connection
{:database=>uc.db, :password=>uc.pass, :user=>uc.username, :host=>uc.dbhost, :adapter=>uc.adapter}
end
# User probably contains other user-facing details
end