正如暗示通過對原問題的評論權,我會通過使用會話只保留用戶的身份接近它。然後,我會從模型和中央數據庫(默認的導軌數據庫)中的邏輯中提取所需的數據庫連接,並保留用戶詳細信息和用戶連接信息。
開始與修改您的用戶模型(假設用戶具有被在中央數據庫中持續一個模型)
- 添加到用戶表示數據的屬性中使用
- 在您的應用程序控制器設置用戶在的before_filter,基於會話密鑰
- 與用戶參數
然後,您可以查找你的d初始化你的東西模型基於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
規則一,不要給用戶「root」的訪問權限。不要。規則二,不要將連接建立在用戶可以在其計算機上更改的某些內容上,例如會話cookie或變量。用戶很聰明,不知道他們會做什麼。 –
這只是一個例子,每個用戶都會有它的db用戶權限...... – user899119
然後請在你的示例代碼中顯示,或者在你的問題中解釋它。 –