0

我的应用程序使用 postgres 模式来实现多租户。所以对于像这样的桌子users,每个租户实际上都有自己的users桌子 -

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

附带说明一下,它使用公寓 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的读取。

有没有一种方便的方法让它遍历我所有的租户?

4

1 回答 1

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!(username) 将租户上下文切换到正确的用户。然后它调用我需要在每个租户上运行的函数。

你应该注意到我也在使用 Apartment Sidekiq 扩展来延迟。

我怀疑这种概念上的飞跃是您正在寻找的。

于 2017-07-08T09:50:46.917 回答