2017-04-27 16 views
0

私のアプリはpostgresスキーマを使用してマルチテナントを実装しています。だから、usersようなテーブルのために、各テナントは、実際にそれが自分のusersテーブルのしている -マルチテナント設定の時計仕掛け

側の注意点としては
  • public.users(デフォルト)
  • foo.users
  • bar.users
  • ...

apartment gem

を使用してマルチテナントを実装しています

clockwork 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

私はPostgresではなくアパートとMySQLを使用している点が非常に似ています。アパートは非常に、非常に強力ですが、それはせいぜい良くないと感じています。私はこれにどのように近づいたのですか:

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!(username)を呼び出して、テナントコンテキストを適切なユーザーに切り替えます。次に、各テナントで実行する必要のある関数を呼び出します。

また、遅延のためにApartment Sidekiq拡張機能も使用しています。

私はこの概念的な飛躍があなたが探しているものだと思っています。

関連する問題