3

我有一个在 Unicorn 上运行的 Sinatra 应用程序,它的模型使用 Mongoid。我有几个结构相同但内容不同的 Mongo 数据库,我在每个用户登录时为他/她选择正确的数据库。我想知道这是否可以使用 Mongoid 3.0。

4

3 回答 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 回答