Моделирование мультитенантного приложения для рельсов, чтобы его было легко обслуживать - PullRequest
0 голосов
/ 29 марта 2019

Я создаю приложение для мультитенантных рельсов, которое использует общую базу данных, в которой данные передаются по всем областям для каждой учетной записи (аналогично Basecamp 3 ), а не с отдельными таблицами и поддоменами. Подход, который я использую, описан здесь .

Каждая учетная запись будет иметь свои собственные данные (например, продукты, инвентарь) и множество пользователей с различными ролями (например, владелец учетной записи, сотрудник, клиент и т. Д.). Я использую Распродажа для регистрации пользователя и входа в систему.

Похоже, есть два подхода, которые я мог бы использовать при моделировании приложения, подобного этому:

  1. Владелец аккаунта регистрируется и создает свой аккаунт, например, при создании профиля. Я бы создал учетную запись через вложенные поля в форме регистрации. Все наследуется от владельца учетной записи, как это ... enter image description here

  1. Или, когда новый пользователь регистрируется, новая учетная запись создается и связывается с этим пользователем (должно ли это произойти с обратным вызовом?). Все (например, продукты и другие пользователи, такие как сотрудники или клиенты) наследуются от учетной записи, а не от владельца учетной записи. Владелец учетной записи - это просто еще один пользователь, который принадлежит учетной записи.

Кажется, вариант 2 - более простое решение, но я заблокирован тем, как создать Учетную запись, когда новый пользователь регистрируется через Распродажу. Я подробно рассмотрел эту проблему здесь , но меня беспокоит то, что способ моделирования моего приложения с помощью Варианта 2 не идеален.

Какой из этих подходов будет наиболее прост в настройке и обслуживании? Или есть другой способ смоделировать это, что мне не хватает?

Поскольку я бы в конечном итоге хотел, чтобы на сайте было несколько пользователей, являющихся клиентами, должен ли я использовать подход к использованию поддоменов (например, Shopify?).

1 Ответ

0 голосов
/ 02 апреля 2019

Итак, я не уверен, насколько хорошо это решение будет работать, так как приложение развивается с течением времени, но я остановился на этом потоке пока, если он поможет кому-то еще с подобной проблемой:

  1. Пользователь регистрируется с помощью бланка регистрации в / 100 * *
  2. После регистрации они перенаправляются на новые аккаунты, если они еще не создали аккаунт
  3. Учетные записи belong_to Пользователь и каждый пользователь has_one Учетная запись
  4. Все остальное, как Продукты, belong_to Учетная запись
  5. Роли пользователя устанавливаются в зависимости от того, как вы регистрируетесь. Поэтому, если вы регистрируетесь с домашней страницы, вы по умолчанию являетесь владельцем учетной записи.
  6. Контроль доступа определяется ролями пользователей и Pundit.
  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

Модели / account.rb

class Account < ApplicationRecord
  belongs_to :user
end

модель / user.rb

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