我的问题
如何为用户创建default_scope,以便将可见性限制为仅在has_many :through 关联的联接表中具有当前租户 (tenants_users.tenant_id == Tenant.current_id) tenants_users记录的用户?我认为这最终是一个语法问题,但它可能比这更深。
我在做什么
我正在使用具有范围的多租户(需要订阅)作为指南来实现多租户。Ryan 使用default_scope根据客户端的当前租户限制可用行。他基本上向包含特定于租户的数据的所有表添加一个tenant_id列,然后在每个模型中包含一个default_scope:
default_scope { where(tenant_id: Tenant.current_id) }
[Tenant.current_id(cattr_accessor)在用户登录时设置(Tenant.current_id = 用户选择的租户的tenant_id)。
这对我来说非常有用,除了我希望用户和租户的多对多关系(而不是 Railscast 假设的多用户对一个租户):一个租户可以有多个用户,我希望用户有权访问多个租户。因此,我的 Users 表上没有tenant_id列,而是有一个 tenants_users 联接表,该表每行都有一个tenant_id和user_id。
我正在寻找的结果的不同描述
如果我启动 Rails 控制台并设置:
Tenant.current_id = 2
。然后说...
User.all
。我只想看到那些在tenants_users表中有一行的用户,以便tenant_id == Tenant.current_id。
如果我说:
User.unscoped.all
然后我想看到所有用户,不管Tenant.current_id是什么。
法典
租户.rb
class Tenant < ActiveRecord::Base
cattr_accessor :current_id
has_many :users, :through => :tenants_users
has_many :tenants_users
def self.current_id=(id)
Thread.current[:tenant_id] = id
end
def self.current_id
Thread.current[:tenant_id]
end
end
用户.rb
class User < ActiveRecord::Base
# This was the default_scope before I moved tenant_id to the tenants_users table
# default_scope { where(tenant_id: Tenant.current_id) }
# What should it be now?
default_scope ???
has_many :tenants_users
has_many :tenants, :through => :tenants_users
end
tenants_user.rb
class TenantsUser < ActiveRecord::Base
belongs_to :tenant
belongs_to :user
end
这基本上连接了tenants_users
表并将条件放在 tenant_id
属性上:
default_scope { where(tenants_users: {tenant_id: Tenant.current_id}) }