2

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.idrole.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最善のアプローチを使用していますか?

ありがとう!

4

4 に答える 4

1

ラベル付けの問題であるため、i18n を使用するのが最善の策だと思います。追加のボーナスは、時が来たら実際の翻訳を行う準備ができていることです.

このように翻訳ファイルを設定できます

  en:
    tenant_roles:
      tenant1:
        role1: "Moderator"
        role2: "Expert"
      tenant2:
        role1: "Editor"
        role2: "Sub-Editor"

次に、ヘルパーでこのようなラベルにアクセスします

def tenant_role_label tenant_name role_name
    t("tenant_roles.#{tenant_name}.#{role_name}")
end

もちろん、tenant_name と role_name が変更されないようにする必要があります。スラッグを使用してそれを行うと、名前やIDに依存しなくなります。

私が提案した他のオプションは、スキーマを使用することですが、私の経験から、i18n を使用するよりも管理が困難です。アプリを介してロール ラベルを更新する必要がある場合は、スキーマまたはその他のデータベース オプションを使用する必要があります。

于 2013-08-13T13:42:06.037 に答える
1

ラベル付けの問題を解決する良い方法は、 を使用することI18nです。各テナントに固有の言語を定義してから、ロール名を翻訳するだけです。あなたの例では、次のことを考慮してください。

en-PHOTOGRAPHY:
  role1: 'Moderator'
  role2: 'Expert'
  role3: 'Apprentice'
  role4: 'Viewer'

en-JOURNALISM:
  role1: 'Editor'
  role2: 'Sub-Editor'
  role3: 'Journalist'
  role4: 'Reader'

# Optional
en:
  role1: 'Super-Admin'
  role2: 'Admin'
  role3: 'User'
  role4: 'Visitor'

上記のようなテナント固有の翻訳を簡単に使用できるようにするマイクロライブラリを作成しました。

https://github.com/ElMassimo/i18n_multitenant

ライブラリは静的.ymlファイルを使用するように設計されていますが、.I18n

于 2017-01-26T15:10:30.493 に答える