親の関連付けに基づいて、子オブジェクトのアクセス許可を確認できますか?
Group
(親) と の間で (関連付け)User
を介して多対多の関連付け (以下の関連付けを参照) を行ってMembership
います。aと aにEvent
属する (子) モデルがあります。には という列があり、これに基づいてパーミッションを設定したいと考えています。Group
User
Membership
role
が が属するのである場合にuser
のみ、 が を作成できるようにしたいと考えています。つまり、記録があります。event
user
owner
group
event
owner
Membership.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
これを行う方法はありますか?