短縮版
クラス変数は、コントローラ アクションの実行中はスレッド セーフですか?
ロングバージョン
tenant_id
データが誰に属しているかを識別するために、各テーブルに列を持つ単一のデータベース スキーマを使用してマルチテナンシーを実装する Rails 3 アプリを作成しています。
当然、データへのアクセスがテナントごとに適切に分離されるように、データベースで実行されるすべてのクエリの範囲を設定する方法が必要です。
tenant
何人かの人々は、常にインスタンスを介してデータベースにアクセスすることでこれを達成することを提案しています。
current_tenant.associate_collection.where(...)
等
ただし、マルチテナンシーはアーキテクチャの問題 (ビジネス ドメインの問題ではない) であるため、スコープをグローバルに設定することで、モデルに対して可能な限り透明性を維持したいと考えています。また、はるかに乾燥しています。
マルチテナントgemとaround_filtersを使用してこれを行うことができることがわかりました:
class ApplicationController
around_filter do
Multitenant.with_tenant current_tenant
yield
end
end
end
これdefault_scope
により、適切なモデルが操作され、すべてのデータ アクセスが現在のテナントに自動的に適用されます。
これは開発ではうまく機能しますが、スレッドの安全性について懸念があります。参照をクラス変数にMultitenant.with_tenant
保存します。current_tenant
問題は、コントローラーのアクションがスタック上にある間、その変数の整合性を信頼できるかどうかです。または、別の要求によって破損している可能性がありますか?
また、Rails の一般的な同時実行の問題に関する良い情報源は何ですか?