我有一个轨道4.2多租户应用程序使用公寓宝石已经很棒。创建新的租户公寓宝石 - 总是重新启动?
每个公司都有自己的子域。我正在使用一个自定义的“电梯”来查看完整的请求主机,以确定应该加载哪个“租户”。
当我创建一个新公司时,我有一个after_create挂钩来创建具有正确请求主机的新租户。
这似乎总是需要重新启动服务器,无论是在开发和生产,否则我得到一个租户未找到错误。
它在开发中使用sqlite和生产中的postgres。
每当我创建新租户时,是否真的必须重新启动服务器?有没有一种自动化的方式来做到这一点?也许只是重新加载初始化工具,但我不知道如何做到这一点/如果这是可能的?
我一直在为此乱搞一个月,一直没有找到可行的解决方案。请帮忙!
初始化/ apartment.rb
require 'apartment/elevators/host_hash'
config.tenant_names = lambda { Company.pluck :request_host }
Rails.application.config.middleware.use 'Apartment::Elevators::HostHash', Company.full_hosts_hash
初始化/ host_hash.rb
require 'apartment/elevators/generic'
module Apartment
module Elevators
class HostHash < Generic
def initialize(app, hash = {}, processor = nil)
super app, processor
@hash = hash
end
def parse_tenant_name(request)
if request.host.split('.').first == "www"
nil
else
raise TenantNotFound,
"Cannot find tenant for host #{request.host}" unless @hash.has_key?(request.host)
@hash[request.host]
end
end
end
end
end
公司型号
after_create :create_tenant
def self.full_hosts_hash
Company.all.inject(Hash.new) do |hash, company|
hash[company.request_host] = company.request_host
hash
end
end
private
def create_tenant
Apartment::Tenant.create(request_host)
end
什么结束了工作
我改变了电梯配置,以摆脱位于公寓宝石中的HostHash,并使用了完全自定义的电梯配置。主要是基于对断公寓宝石GitHub的一个问题:https://github.com/influitive/apartment/issues/280
初始化/ apartment.rb
Rails.application.config.middleware.use 'BaseSite::BaseElevator'
应用/中间件/ base_site.rb
require 'apartment/elevators/generic'
module BaseSite
class BaseElevator < Apartment::Elevators::Generic
def parse_tenant_name(request)
company = Company.find_by_request_host(request.host)
return company.request_host unless company.nil?
fail StandardError, "No website found at #{request.host} not found"
end
end
end
我没有回答您的具体问题,但继续并开始在您的开发环境中运行Postgres。它可能无法解决这个问题(但它可能!),但它的开发环境的最佳实践。模仿你的prod env。 SQLite非常适合原型设计,但是一旦你的应用程序开始推出,你应该继续开发与产品一致的开发工具。 – Lumbee
同意。我绝对应该这样做。我的议程在下周完成。这是一个侧面项目变成了生产应用程序。 –
看到电梯代码会很有帮助。正如Lumbee指出的那样,您应该继续并将您的开发数据库更改为PostgreSQL。使用公寓宝石时尤其如此。当你创建一个新的租户时,Apartment为数据库中的Tenant设置一个新的模式,并在SQLite中为它创建一个新的数据库以记录与新租户相关的记录。这可能是一个手动工作的痛苦,这是公寓的美丽。 ** GoRails **的Chris Oliver有一个很好的例子,它简化了这里的概念:https://gorails.com/episodes/multitenancy-with-apartment –