0

我正在使用acts_as_tenant gem 来管理多租户平台,同时使用设计来管理用户。我们系统中的用户acts_as_tenant 和belongs_to 组织。组织acts_as_tenant 和has_many 用户。

我们无法理解什么是确保在注册时创建用户、创建组织、创建租户(基于组织)以及保存当前租户的最佳方法,然后在用户上设置正确的tenant_id和组织模型。

问题是为了让用户有效,它必须有一个组织和一个租户。因此,在验证发生之前,我们必须创建组织和租户,我们正在尝试使用以下代码:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :confirmable

  acts_as_tenant(:tenant)
  acts_as_paranoid
  belongs_to :organization

  before_validation :create_organization

  def create_organization
    if self.organization_id.nil?
      org = Organization.new(name: self.email)
      org.uuid = UUIDTools::UUID.random_create.to_s
      self.organization_id = org.uuid
    end
  end
end
class Organization < ApplicationRecord
  acts_as_tenant(:tenant)
  self.primary_key = :uuid
  has_many :users

  before_validation :create_tenant

  def create_tenant
    puts 'making new tenant'
    t = Tenant.new(:short_name => self.name)
  end
end
class ApplicationController < ActionController::Base
  set_current_tenant_through_filter
  before_action :find_current_tenant
  def find_current_tenant
    unless current_user.nil?
      set_current_tenant(current_user.organization.tenant)
    end
  end
end

但是在验证之前没有创建用户组织和租户,导致验证错误“租户必须存在”,“组织必须存在”。

这里有关于最佳实践的帮助吗?

4

1 回答 1

0

我不知道你的业务逻辑,但为了做 acts_as_tenant(:tenant)你的模型必须有一个定义到的关系tenant,你似乎没有。我认为您想要做的(常见用例)是:

class User < ActionController::Base
  belongs_to :organization
  acts_as_tenant(:organization)
end

class Organization < ActionController::Base
  self.primary_key = :uuid
  has_many :users
  # and nothing else
end

您没有在模型上设置当前租户。这是不正确的。您可以在应用程序控制器上执行此操作,仅通过执行set_current_tenant(current_user.organization)即可

更新:你现在提到了一个租户类。

所以现在你的组织类应该定义这种关系

class Organization < ApplicationRecord
  acts_as_tenant(:tenant)
  self.primary_key = :uuid
  has_many :users
  belongs_to :tenant

  before_validation :create_tenant

  def create_tenant
    puts 'making new tenant'
    self.tenant ||= Tenant.create!(:short_name => self.name)
  end
end
于 2019-08-14T17:45:13.357 回答