だから私は次の設定をしています:
class User < AR
has_many :memberships
has_many :user_groups, through: :memberships
has_many :organizations, through: :memberships
end
class Membership < AR
belongs_to :user
belongs_to :user_group
belongs_to :organization
end
class UserGroup < AR
has_many :memberships
has_many :users, through: :memberships
has_many user_groups, through: :memberships
end
つまり、1 人のユーザーが、組織 A ではプロダクト マネージャー、組織 B では記事マネージャーおよびコメント マネージャーになることができます。
したがって、質問できるようにするには、次can? :manage, an_article_instance
のように能力を設定する必要があります。
class Ability
if user.is_content_manager_for(currently_selected_organization)
can :manage, Article
elsif user.is_admin_for(currently_selected_organization)
can :manage, User, memberships: { organization_id: currently_selected_organization }
end
end
バックエンドの Web インターフェイスには、ユーザーが作業したい組織を選択できる選択メニューがあるはずです。そのため、現在選択されている組織をセッションに保存することを考えていました。これは、作業セッション全体で永続的なデータであるためです。
currently_selected_organization
しかし、Ability (またはその他の) モデルで (または直接セッションに)ヘルパー メソッドにアクセスすると、実際には MVC パターンに違反します。これは良くない、などなど、いくつかの場所で読みました。
だから、これを行うためのより良い/よりクリーンな方法があるかどうか疑問に思っていますか?