У меня есть many-many отношения как это: пользователь has_many организации посредством присоединения и наоборот.
Я использую декларативные организации, и я только хочу, чтобы пользователь отредактировал конкретную организацию, если он аффилирован, и affiliationtype атрибут присоединения является конкретным значением.
Так присоединение имеет 3 столбца, user_id, organization_id и affiliationtype_id
Я могу сделать:
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"
Я надеюсь, что это - проблема синтаксиса... Я действительно должен получить эту работу.
РЕДАКТИРОВАТЬ:
Вы можете ограничить тип аффилированности с помощью intersects_with (& block) :
has_permission_on [:organizations], :to => :edit do
if_attribute :affiliations => intersects_with {
user.affiliations.with_type_3
}
end
Почему бы не создать named_scope, чтобы найти филиалы, чей affiliationtype_id = 3?
Из документация 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