2017-04-27 103 views
0

我的應用使用postgres模式實現多租戶。因此,對於像users表,每個租戶其實都有它自己的users表 -用多租戶設置發條

  • public.users(默認)
  • foo.users
  • bar.users
  • ...

作爲一個側面說明它實現了多租戶使用apartment gem

發條寶石允許您使用它的sync_database_events方法從數據庫表中讀取事件。例如,它可以從一個scheduled_jobs表/模型讀取事件:

sync_database_events model: ScheduledJob, every: 1.minute do |model_instance| 
    rake model_instance.name 
end 

默認情況下,這個來自public.scheduled_jobs讀,但我的模式的每一個都會有它自己的scheduled_jobs從閱讀。

是否有一種方便的方式讓它通過我的所有租戶?

回答

0

我正在做一個非常類似的事情,區別在於我使用的是Apartment和MySQL而不是Postgres。公寓是非常非常強大的,但它的感覺很差。這裏是我如何接近這個:

if Rails.env.development? 
    every(1.day, '3am.job -- Daily Job', :at => '03:00') do |job| 
    User.delay.crawl 
    Search.delay.crawl 
    end 
elsif Rails.env.production? 
    every(1.day, '3am.job -- Daily Job', :at => '03:00') do |job| 
    SiteApi.usernames.each do |username| 
     Apartment::Tenant.switch!(username) 
     User.delay.crawl 
     Search.delay.crawl   
    end 
    end 
end 

魔術發生在我的Rails.env.production?塊。 SiteApi是一個API,與我的主用戶數據庫進行通信並獲取一組用戶名。然後它調用Apartment :: Tenant.switch!(用戶名)將租約上下文切換到正確的用戶。然後它調用我需要在每個租戶上運行的功能。

您應該注意,我也在使用Apartment Sidekiq延期服務。

我懷疑這個概念上的飛躍是你在找什麼。