为多租户Rails应用建模,以便于维护

时间:2019-03-28 22:28:54

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

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

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

对于这样的应用程序建模,似乎可以采用两种方法:

  1. 帐户所有者注册并创建帐户,就像创建个人资料一样。我会通过注册表单上的嵌套字段创建帐户。一切都继承自帐户所有者,就像这样... enter image description here

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

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

以下哪种方法最容易设置和维护?或者,还有其他方法可以为我所缺少的模型建模吗?

因为我最终希望该网站吸引一些用户,所以我应该the approach使用子域(例如Shopify吗?)。

1 个答案:

答案 0 :(得分:0)

因此,我不确定随着应用程序的发展,该解决方案的效果如何,但是如果可以帮助其他遇到类似问题的人,我现在就继续进行以下工作:

  1. 用户通过/ signup上的通关注册表格进行注册
  2. 注册后,如果他们尚未创建帐户,则会将他们重定向到帐户/新帐户
  3. 帐户belong_to用户和每个用户has_one帐户
  4. 所有其他产品(例如产品)belong_to帐户
  5. 根据您的注册方式设置用户角色。因此,如果您从首页注册,则默认情况下您是帐户所有者。
  6. 访问控制由用户角色和权威决定。
  7. 数据之所以孤立,是因为其他所有东西(例如产品)belong_to帐户

以下是关系的示意图: enter image description here

代码如下:

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