正如 kwon 在对原始问题的评论中所暗示的那样,我将通过使用会话来处理它,仅保留用户的身份。然后,我将从模型中的逻辑和一个中央数据库(默认的 rails DB)中提取所需的数据库连接,以保存用户详细信息和用户连接信息。
从修改您的用户模型开始(假设您的用户有一个保存在中央数据库中的模型)
- 向用户添加一个属性,表示要使用的数据
- 在您的应用程序控制器中,根据会话密钥在 before_filter 中设置用户
- 使用用户参数初始化您的 Stuff 模型
然后,您可以根据 database.yml 查找您的数据库连接。或者,如果每个用户有一个数据库,并且您需要它是动态的,则创建第二个模型(在中央数据库中)表示与用户模型上的外键的数据库连接。
以下是一堆在现实中可能有效也可能无效的代码,但希望能为您提供一个入门模板。
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