マルチテナントの「顧客」モデルは、「org _#{current_user.org.id} _customers」パターン(つまり、org_1_customers、org_2_customersなど)の複数の表のデータを表します。私はRequestStore gemを使ってcurrent_userのORG_IDを保存しています。マルチテナント・レールモデル継承
CURRENT組織のデータにアクセスするには、明示的に "Customer.org"(Customer.org.where(...)load)を呼び出す必要があります。これはたくさんのコードを書き直す必要があり、データにアクセスするたびに「org」を追加することを忘れないでください。
私の質問:「Customer」に電話して「Customer.org」にアクセスできるようにする方法があるので、現在のテナント/組織の顧客には「Customer」を使用し、「Customer.select_org (7)」他のテナント/組織の顧客については?
class ApplicationController < ActionController::Base
before_filter :find_organization
private
def find_organization
RequestStore[:current_org] = current_user ? current_user.org : nil
end
end
class SegregatedMultitenantModel < ActiveRecord::Base
self.abstract_class = true
def self.select_org(org_id)
@subdomain_classes ||= {}
unless @subdomain_classes[org_id]
@subdomain_classes[org_id] ||= Class.new(self)
@subdomain_classes[org_id].table_name = "org_#{org_id}_#{self.table_name}" # This needs sanitizing, of course
@subdomain_classes[org_id].reset_column_information
end
@subdomain_classes[org_id]
end
def self.org
if RequestStore[:current_org].nil?
raise "No Organization Selected For #{self.table_name}"
else
self.select_org(RequestStore[:current_org].id)
end
end
end
class Customer < SegregatedMultitenantModel
end
P.S.私のアプリケーションでは、テナント間のテーブルフィールドの違いにより、複数の顧客テーブルが必要です。
'default_scope'を使用できませんか? – MrYoshiji
私はテーブルを切り替えようとしており、default_scopeは1つのテーブル内のレコードをフィルタリングするためにのみ使用されています。 –
私は「問題」それ自体はありません。私は、Customerモデルを使用するときに、テナント固有のテーブルを参照するというコンベンションで、自分のアプリケーションを構築しようとしています。したがって、リクエストごとに異なるでしょう。 –