Снижение нагрузки на ability.rb в cancan

У меня есть большой файл способностей, который решает, что именно могут делать пользователи, выполняя поиск по таблице "Роли". Каждая роль соответствует тому, что может делать конкретный пользователь, например, возможность добавить проект или возможность редактировать главную запись компании.

На данный момент каждое действие контроллера, выполняющее load_and_authorize_resource, проходит через >30 запросов типа:

ability.rb (>30 times)
Role.where("user_id = ? AND role = ? AND roleable_type = ? AND roleable_id IS NULL", user.id, "delete", "task").last.present? ? (can :destroy, Task) : nil

Это ужасно неэффективное решение, потому что сервер выполняет >30 запросов, прежде чем что-то сделать.

Лучшим способом сделать это было бы выполнение только тех запросов, которые необходимы на основе того, что требуется контроллеру и представлению. Есть ли способ сделать это?

6
задан ronalchn 18 August 2012 в 23:13
поделиться