【问题标题】:Setting tenant scope for DelayedJob为 DelayedJob 设置租户范围
【发布时间】:2012-11-30 01:19:42
【问题描述】:

我有一个多租户 Rails 应用程序,它在许多模型上都有一个 tenant_id 列。

属于特定租户的每个模型都有一个基于租户类上的类变量的默认范围:

default_scope { where(tenant_id: Tenant.current_id) }

Tenant.current_id 在应用程序控制器中设置。

问题是,当我(通过延迟作业)发送有关租户范围对象(即UserMailer.delay.contact_user(@some_user_in_a_specific_tenant))的邮件时,每当我在@some_user_in_a_specific_tenant 内调用任何内容时,我都会收到NoMethodErrors for nilClass邮递员。大概是因为延迟作业进程没有设置Tenant.current_id

如何让 DJ 访问我传入的对象?

【问题讨论】:

    标签: ruby-on-rails delayed-job multi-tenant


    【解决方案1】:

    当您对作业进行排队时获取 current_id 并从中构建一个不依赖于应用程序中的类变量的范围。或者先获取要操作的记录 ID 列表,然后将其传递给 DJ。

    例子:

    def method_one(id)
      Whatever.where(:tenant_id => id).do_stuff
    end
    
    def method_two(ids)
      Whatever.find(ids).do_stuff
    end
    
    handle_asynchronously :method_one, :method_two
    
    # then
    method_one(Tenant.current_id)
    
    # or
    ids = Whatever.all.map(&:id)
    method_two(ids)
    

    【讨论】:

    • 我明白了。我的延迟方法都是邮件程序方法,这使得它不那么简单,但我会尝试这种通用方法。
    • 是的,这确实是唯一合理的方法。 delay_job 进程只是另一个应用程序,用于提取数据库记录并运行作业。除非您告诉它,否则它无法知道您的主应用程序的状态。
    • 这看起来很有希望。我会试试:)
    • 如果Whatever类使用default_scopemethod_one不应该是:Whatever.unscoped.where(:tenant_id => id).do_stuff吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多