从多租户应用程序中的两个或多个模式访问数据
Accessing data from two or more schemas in a multi tenant application
我们正在使用 apartment gem 进行多租户应用程序。对于每个帐户,将维护一个单独的架构。根据账户的子域,我们列出每个账户中的数据。
在我们的新需求中,有一个类似于超级账户的东西,可以查看所有账户数据。例如,如果在用户列表页面中选择了账号1和账号2,则账号1和账号2的用户应该结合搜索条件一起查看。有没有办法在公寓中组合多个模式数据?或任何其他替代品
我能想到的最简单的方法是跨相关模式执行联合查询。所以如果你有模式 account_1
和 account_2
,你会做类似 SELECT * FROM account_1.users UNION SELECT * FROM account_2.users
.
的事情
当然,您可以将其设为动态 - 因此,如果您将受影响的帐户作为 params
散列的一部分发送,您可能会得到如下内容:
accounts = Account.find(params[:account_ids])
# assuming the schema name is stored in the accounts.tenant_name column:
sql = accounts.map { |account| "SELECT * FROM #{account.tenant_name}.users" }.join(" UNION ")
users = User.find_by_sql(sql)
我们正在使用 apartment gem 进行多租户应用程序。对于每个帐户,将维护一个单独的架构。根据账户的子域,我们列出每个账户中的数据。
在我们的新需求中,有一个类似于超级账户的东西,可以查看所有账户数据。例如,如果在用户列表页面中选择了账号1和账号2,则账号1和账号2的用户应该结合搜索条件一起查看。有没有办法在公寓中组合多个模式数据?或任何其他替代品
我能想到的最简单的方法是跨相关模式执行联合查询。所以如果你有模式 account_1
和 account_2
,你会做类似 SELECT * FROM account_1.users UNION SELECT * FROM account_2.users
.
当然,您可以将其设为动态 - 因此,如果您将受影响的帐户作为 params
散列的一部分发送,您可能会得到如下内容:
accounts = Account.find(params[:account_ids])
# assuming the schema name is stored in the accounts.tenant_name column:
sql = accounts.map { |account| "SELECT * FROM #{account.tenant_name}.users" }.join(" UNION ")
users = User.find_by_sql(sql)