我的应用使用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 :(得分: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延期延迟。
我怀疑这个概念上的飞跃是你正在寻找的。