【问题标题】:Modeling a multi-tenant rails app so that it's easy to maintain为多租户 Rails 应用程序建模,使其易于维护
【发布时间】:2019-08-19 19:48:52
【问题描述】:

我正在构建一个使用共享数据库的多租户 Rails 应用程序,其中通过将所有内容限定到每个帐户(类似于 Basecamp 3)来隔离数据,而不是使用单独的表和子域。我正在采取的方法描述为here

每个帐户都有自己的数据(例如产品、库存)和许多具有不同角色的用户(例如帐户所有者、员工、客户等)。我使用Clearance 进行用户注册和登录。

似乎有两种方法可以对这样的应用程序进行建模:

  1. 帐户所有者注册并创建他们的帐户有点像创建个人资料。我会通过注册表单上的嵌套字段创建帐户。一切都像这样从帐户所有者继承...

  1. 或者,当新用户注册时,会创建一个新帐户并与该用户关联(这是否应该通过回调发生?)。一切(例如产品和其他用户,如员工或客户)都继承自帐户,而不是帐户所有者。帐户所有者只是属于该帐户的另一个用户。

似乎选项 2 是更简单的解决方案,但是当新用户通过 Clearance 注册时,我无法了解如何创建帐户。我已经进入more detail on this problem here,但我担心我使用选项 2 为我的应用程序建模的方式并不理想。

这些方法中的哪一种最容易设置和维护?或者,是否有另一种我缺少的建模方法?

因为我最终希望该网站有一些用户是客户,所以我是否应该接受 the approach 使用子域(如 Shopify?)。

【问题讨论】:

  • 在这两种模型中,您最终会得到相同的表格,对吧?即使在选项 2 中,我仍然会创建一个与用户表的作用域 has_one 关系,我将其命名为 :account_owner,因此我并没有真正看到两个建议模型之间的区别。我认为即使选择两者之一,切换也不会太费力,还是我错过了一些琐碎的部分?
  • 是的,这将是相同的表。我想我正在努力找出将它们关联起来并将其纳入注册表单的最佳方式。例如,帐户是否应该属于用户?在这种情况下,如果他们通过注册表单来创建帐户,则可以通过回调创建帐户,如果向他们发送邀请,则分配他们的帐户。或者,用户应该属于该帐户吗?在这种情况下,新用户注册时如何创建帐户?
  • 我认为这也取决于帐户所有者是否与其他类型的用户共享很多逻辑。客户/员工是否也可以登录(就像用户一样)。您最终是否允许与多个帐户所有者共享帐户所有权等?您甚至可以考虑在帐户之间使用角色表,并映射每个用户在特定帐户中扮演的角色类型。
  • 是的,帐户所有者将与其他用户共享很多逻辑。看起来我的“选项 2”是本书采用的方法leanpub.com/multi-tenancy-rails-2/read_sample

标签: ruby-on-rails architecture data-modeling multi-tenant clearance


【解决方案1】:

因此,我不确定随着应用程序随着时间的推移,该解决方案的效果如何,但如果它可以帮助其他有类似问题的人,我最终会采用此流程:

  1. 用户通过 /signup 的许可注册表单进行注册
  2. 注册后,如果他们尚未创建帐户,他们将被重定向到帐户/新帐户
  3. 账户belong_to用户和每个用户has_one账户
  4. 其他所有内容,例如产品,belong_to 帐户
  5. 根据您的注册方式设置用户角色。因此,如果您从主页注册,则默认情况下您是帐户所有者。
  6. 访问控制由用户角色和 Pundit 确定。
  7. 数据是孤立的,因为其他所有内容(例如产品)belong_to 帐户

以下是关系示意图:

代码如下:

accounts_controller.rb

# POST /accounts
  def create
    @user    = current_user
    @account = @user.build_account(account_params)

    respond_to do |format|
      if @account.save
        format.html { redirect_to @account, notice: 'Account was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end


  def account_params
    params.require(:account).permit(:company_name, :user_id)
  end

models/account.rb

class Account < ApplicationRecord
  belongs_to :user
end

models/user.rb

class User < ApplicationRecord
  include Clearance::User
  has_one :account
end

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 2011-02-16
    • 2012-05-17
    • 2013-04-23
    • 2010-09-25
    • 2013-03-24
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多