【问题标题】:Accessing data from two or more schemas in a multi tenant application从多租户应用程序中的两个或多个模式访问数据
【发布时间】:2021-01-05 16:04:18
【问题描述】:

我们将apartment gem 用于多租户应用程序。对于每个帐户,都会有一个单独的架构被维护。根据账户的子域,我们列出每个账户中的数据。

在我们的新要求中,有一个类似于超级帐户的东西,可以查看所有帐户数据。例如,如果在用户列表页面中选择了账户1和账户2,则账户1和账户2的用户应该结合搜索提供一起查看。有没有办法在公寓中组合多个模式数据?或任何其他替代品

【问题讨论】:

    标签: ruby-on-rails multi-tenant apartment-gem


    【解决方案1】:

    我能想到的最简单的方法是跨相关架构执行联合查询。因此,如果您有架构 account_1account_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)
    

    【讨论】:

    • 感谢您的回复。这是工作。但是,公寓宝石中是否有任何选择可以实现这一目标?
    • 我们如何根据账户区分记录? - 用例:我可能需要显示用户帐户的信息
    • 你为什么想要“在公寓中的宝石”来实现这一目标?它是简单明了的默认 Rails,没有额外的 gem、monkeypatching 或任何东西。您可以在 Arel 中重写它,如果这更适合您的口味,但再说一遍:我认为没有任何理由这样做。
    • 关于你的第二个问题,我不太明白。如果您在这里担心的是权限(即并非所有用户都应该能够查看所有帐户),您可以执行以下操作:account_ids = params[:account_ids].map(&:to_i) & current_user.account_ids(假设current_user.account_ids 包括current_user 可以访问的所有帐户) .这可以防止用户尝试访问他们无权访问的资源的漏洞。 (注意:如果您想更深入地进行权限管理,可以使用 cancancan 或 pundit 之类的 gem。)
    猜你喜欢
    • 1970-01-01
    • 2014-01-23
    • 2013-03-24
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多