7

私はこのような多対多の関係を持っています: ユーザーは所属を通じて多くの組織を持ち、その逆も同様です。

私は宣言型の組織を使用しています。ユーザーが所属していて、所属の affiliationtype 属性が特定の値である場合にのみ、特定の組織を編集できるようにしたいと考えています。

したがって、所属には、user_id、organization_id、affiliationtype_id の 3 つの列があります。

できます:

o = Organization.find(:first)
o.affiliatons[0].user and get the user

今私はこれをしたい:

has_permission_on [:organizations], :to => :edit do
  if_attribute (...)
end

if_attribute は、現在のユーザーが organization.affiliation[?].user であるかどうか、および organization.affiliation[?].affiliationtype_id = "3" であるかどうかを確認する必要があります。

これが構文の問題であることを願っています...これを機能させる必要があります。

4

1 に答える 1

7

編集:

intersects_with(&block)を使用して、所属のタイプを制限できます。

  has_permission_on [:organizations], :to => :edit do
    if_attribute :affiliations => intersects_with {
      user.affiliations.with_type_3
    }
  end

affiliationtype_id = 3 のアフィリエーションを見つけるために、named_scope を作成してみませんか?


declarative_authorization のドキュメントから:

has_permission_on ブロックの冗長性を減らすために、ルールは関連するオブジェクトのパーミッションに依存する場合があります。

authorization do
  role :branch_admin do
    has_permission_on :branches, :to => :manage do
      if_attribute :managers => contains {user}
    end

    has_permission_on :employees, :to => :manage do
      if_permitted_to :manage, :branch
      # instead of
      #if_attribute :branch => {:managers => contains {user}}
    end
  end
end
于 2010-03-13T21:01:28.863 に答える