Mein mandantenfähiges "Kunden" -Modell stellt Daten aus mehreren Tabellen in einem "org _ # {current_user.org.id} _customers" -Muster (d. H. Org_1_customers, org_2_customers usw.). Ich verwende RequestStore Gem, um die ORG_ID des aktuellen Benutzers zu speichern.Multitenant Rails-Modell Vererbung
Also das Problem ist, dass auf Daten der aktuellen Organisation zugreifen muss, muss ich explizit "Customer.org" (d. H. Customer.org.where (...). Load) aufrufen. Das erfordert, viel Code neu zu schreiben und daran zu erinnern, jedes Mal, wenn ich auf die Daten zugreife, "org" hinzuzufügen.
MEINE FRAGE IST: Gibt es eine Möglichkeit, es so zu machen, dass ich "Customer.org" aufrufen konnte, indem ich "Kunde" anrufe, also würde ich "Kunde" für die Kunden des aktuellen Mandanten/org und "Customer.select_org" verwenden (7) "Für die Kunden anderer Mieter/Org.
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. Meine Anwendung erfordert mehrere Kundentabellen aufgrund von Unterschieden in Tabellenfeldern zwischen Mandanten!
Können Sie nicht ein 'default_scope' verwenden? obwohl es nur ein Symptom für ein größeres Problem erleichtern würde – MrYoshiji
Ich versuche, zwischen Tabellen zu wechseln, und default_scope wird nur verwendet, um die Datensätze innerhalb einer Tabelle zu filtern. –
Ich habe kein "Problem" per se. Ich versuche nur, meine App nach einer Konvention zu erstellen, die bei Verwendung des Kundenmodells auf eine mandantenspezifische Tabelle verweist. So wird es bei jeder Anfrage anders sein. –