我有一个多域Rails 4应用程序,其中http请求的request.domain
确定我将给定访问者公开的功能。访问者可以通过Devise注册。在user
创建期间,user.domain
字段将填入他注册的域名,然后他将只能访问此特定域及其功能。
问题:
我的应用中的每个域都应该由自己的MongoDB数据库提供服务。如果user.domain == 'domain1.com'
user
对象以及belongs_to
对象的所有对象都应存储在提供 domain1.com 的数据库中。我该如何设置?
并发症1:
我不仅通过Mongoid与我的数据库进行交互,还通过mongo Shell方法(如db.collection.insert())进行交互。在这两种情况下我都需要有正确的数据库连接。例如:
class ApplicationController < ActionController::Base
before_filter :connect_to_db
def connect_to_db
domain = request.domain
# Establish connection
end
end
并发症2:
许多数据库交互发生在MVC上下文之外。我需要在例如正确的数据库连接中一个Sidekiq上下文。例如:
class MyJob
include Sidekiq::Worker
def perform(domain)
connect_to_db(domain)
User.all.each do |user|
...
end
end
def connect_to_db(domain)
# Establish connection
end
end
可能相关的SO答案:
This answer和this answer建议您可以在模型级别应用set_database
或store_in session
方法,但这对我来说是不够的,因为模型是共享的我的域名之间。 this Google group中也讨论了各种各样的策略。