3

tenant_id多くのモデルに関する列を持つマルチテナント Rails アプリがあります。

特定のテナントに属する各モデルには、テナント クラスのクラス変数に基づくデフォルトのスコープがあります。

default_scope { where(tenant_id: Tenant.current_id) }

Tenant.current_idアプリケーションコントローラに設定されています。

問題は、テナント スコープのオブジェクト (つまり ) に関するメールを (遅延ジョブ経由で) 送信すると、メーラー内で何かを呼び出すたびにsUserMailer.delay.contact_user(@some_user_in_a_specific_tenant)を取得することです。おそらく、遅延ジョブ プロセスが を設定していないためです。NoMethodErrornilClass@some_user_in_a_specific_tenantTenant.current_id

渡したオブジェクトに DJ がアクセスできるようにするにはどうすればよいですか?

4

1 に答える 1

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)
于 2012-11-29T04:39:23.330 に答える