我有一个在 Unicorn 上运行的 Sinatra 应用程序,它的模型使用 Mongoid。我有几个结构相同但内容不同的 Mongo 数据库,我在每个用户登录时为他/她选择正确的数据库。我想知道这是否可以使用 Mongoid 3.0。
问问题
1054 次
3 回答
5
如果要切换数据库,请使用Mongoid.override_database
,它是线程安全的。
Mongoid.override_database("client_db_name") # change the database
Mongoid.override_database(nil) # reset the database
例子:
class ApplicationController < ActionController::Base
before_filter :switch_database
after_filter :reset_database
private
def switch_database
client_ref = params[:client_id]
Mongoid.override_database("my_db_name_#{client_ref}")
end
def reset_database
Mongoid.override_database(nil)
end
end
文档可以在这里找到。
于 2013-02-23T12:34:32.993 回答
3
您可以with
在每个查询之前使用运算符:
Model.with(database: method_to_get_the_db_name).create
于 2013-02-19T17:33:45.593 回答
0
有mongoid-dynamic-clients gem。
我也有我自己的 Mongoid 5 辅助方法,它使用默认连接但不同的数据库名称:
def within_database(name)
previous_client = Mongoid::Threaded.client_override
unless Mongoid::Config.clients[name].present?
Mongoid.clients[name] = Mongoid::Config.clients[:default].dup
Mongoid.clients[name][:database] = name
Mongoid::Config.clients[name][:__instance] = Mongoid::Clients::Factory::create(name)
end
Mongoid.override_client(name)
yield Mongoid::Config.clients[name][:__instance]
Mongoid.override_client(previous_client)
end
用法:
within_database('my_different_database') do |connection|
puts "Current database: #{connection.database.name}"
Model.all.length
# Or you may even drop it by using the connection object
connection.database.drop
end
于 2018-09-22T07:34:32.003 回答