4

親の関連付けに基づいて、子オブジェクトのアクセス許可を確認できますか?

Group(親) と の間で (関連付け)Userを介して多対多の関連付け (以下の関連付けを参照) を行ってMembershipいます。aと aにEvent属する (子) モデルがあります。には という列があり、これに基づいてパーミッションを設定したいと考えています。GroupUserMembershiprole

が が属するのである場合にuserのみ、 が を作成できるようにしたいと考えています。つまり、記録があります。eventuserownergroupeventownerMembership.where(user_id: user, group_id: group, role: 'admin')

ドキュメントはAccessing Parent in Abilityの下でこれをほのめかしていますが、関連付けを通過することについては何も言及していません。

# in Ability
can :manage, Task, :project => { :user_id => user.id }

その例を私のユースケースに変換するには:

# in Ability
can :create, Event, :group => { group.owner == user }

私はすでに group.owner セットアップを持っています:

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group, inverse_of: :memberships
end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, through: :memberships

  has_many :ownerships, class_name: 'Membership', conditions: { role: 'admin' }
  has_many :owned_groups, through: :ownerships, source: :group

  has_many :events
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, through: :memberships

  has_one :ownership, class_name: 'Membership', conditions: { role: 'admin' }
  has_one :owner, through: :ownership, source: :user

  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :organizer, class_name: 'User', foreign_key: 'user_id'
  belongs_to :group
end

これを行う方法はありますか?

4

1 に答える 1

2

あなたの許可はグループに基づいている必要があるようです:

can :create_events, Group, owner_id: user.id

グループとイベントにネストされたルートを使用していますか?

編集:

can :create_events, Group, owner: { id: user.id }
于 2012-10-14T18:53:37.223 に答える