Я сейчас работаю над небольшим проектом Rails. Я использую Pundit для авторизации действий контроллера и прочее. Теперь задание - использовать Pundit для действия индекса и использовать Pundit's policy_scope
в моем контроллере, чтобы получить проекты, которые пользователь может видеть.Область Rails с сложным SQL-заявлением, включая OR
Есть 3 способа пользователь должен иметь возможность видеть проект: - Он владелец - Он был приглашен - Проект общественного
Я пытался несколько решений прямо сейчас, но в конечном итоге делаю следующее:
scope :public_or_involved, -> (user) {
joins('LEFT JOIN invitations ON invitations.project_id = projects.id').
where('projects.is_public = TRUE OR projects.owner_id = ? OR invitations.reciever_id = ?', user.id, user.id)
}
Это единственный способ, которым я получил нечто вроде «public_or_involved» работать со следующей рамкой пандита в project_policy.rb:
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope.public_or_involved(user)
end
end
Так что мой вопрос, наконец:
Есть элегантный способ сделать то, что я делаю сейчас? Это кажется уродливым, а не рельсовым.
Этого не может быть! Серьезно этот материал - это способ НЕ СУХОЙ и нелегкий для чтения :( – wegginho
Я считаю, что его легче читать, чем альтернативы, учитывая текущее состояние Rails + ActiveRecord/Arel/Squeel/Metawhere и т. Д. – messanjah