if_attribute при декларативной авторизации
-
19-09-2019 - |
Вопрос
У меня есть такое отношение многие-ко-многим:Пользователь имеет_много организаций через филиалы и наоборот.
Я использую декларативные организации и хочу, чтобы пользователь редактировал конкретную организацию только в том случае, если он является аффилированным лицом и атрибут affiliationtype affiliationtype имеет определенное значение.
Таким образом, affiliations имеет 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(&блок) :
has_permission_on [:organizations], :to => :edit do
if_attribute :affiliations => intersects_with {
user.affiliations.with_type_3
}
end
Почему бы не создать Name_scope для поиска филиалов, у которых affiliationtype_id = 3?
От документация по декларативной_авторизации:
Чтобы уменьшить избыточность в блоках 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