我有一個軌道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 –