Rails でマルチテナント Web アプリを構築しており、一部のモデル オブジェクトにテナント固有のラベルを付ける必要があります。
以下は、私が言いたいことを説明するための架空の例です。
テナントごとに異なるラベルを持つロール モデル オブジェクトがあります。
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
validates_presence_of :name
end
写真テナントでは、使用可能なロール名を次のようにリストする必要があります。
- モデレータ
- エキスパート
- 見習い
- ビューアー
ジャーナリズム テナントでは、使用可能なロール名を次のようにリストする必要があります。
- 編集者
- サブエディター
- ジャーナリスト
- 読者
基本的に、アプリ内には常に 4 つのレベルのアクセス許可がありますが、テナントが異なると、各ロールの名前が異なるだけです。したがって、上記の例では、写真のモデレーターとジャーナリズムの編集者は同じ権限を持っていますが、ラベルが異なるだけです。
関連付けを使用することもできますhas_many :through
が、ロール ラベルを取得するためだけに 3 つのテーブルを結合する必要は避けたいと思います。
class Tenant < ActiveRecord::Base
has_many :roles, :through => :tenant_roles
end
class TenantRole < ActiveRecord::Base
belongs_to :tenant
belongs_to :role
validates_presence_of :name
end
class Role < ActiveRecord::Base
has_many :tenants, :through => :tenant_roles
end
また、ロール ラベルを Redis に保存し (他の理由で既に配置しています)、 and をキーとして使用することも考えましcurrent_tenant.id
たrole.id
。これは速いはずですが、それは悪い考えですか?
class Role < ActiveRecord::Base
@tenant_roles = Redis::Set.new('tenant_roles')
def name(current_tenant)
@tenant_roles["#{current_tenant.id}-#{self.id}"]
end
end
これを行うための最良の方法に関する他のアイデアはありますか? has_many :though
最善のアプローチを使用していますか?
ありがとう!