1

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

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

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

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

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

似乎选项 2 是更简单的解决方案,但是当新用户通过 Clearance 注册时,我无法创建帐户。我已经在这里详细介绍了这个问题,但我担心我使用选项 2 为我的应用程序建模的方式并不理想。

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

因为我最终希望网站有一些用户是客户,所以我应该采取使用子域的方法(比如 Shopify?)。

4

1 回答 1

0

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

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

这是关系的草图: 在此处输入图像描述

这是代码:

account_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

模型/account.rb

class Account < ApplicationRecord
  belongs_to :user
end

模型/用户.rb

class User < ApplicationRecord
  include Clearance::User
  has_one :account
end
于 2019-04-02T16:49:07.133 回答