Рефакторинг before_filters в контроллере - PullRequest
0 голосов
/ 03 января 2009

Я работаю над приложением rails, в котором есть целый набор фильтров before в users_controller, которые просматривают роли пользователя с состоянием, предоставляемые Acts в качестве конечного автомата. Они выглядят примерно так:

class UsersController < ApplicationController

before_filter :not_logged_in_required, :only => [:new, :create]
before_filter :find_user_or_current_user, :only => [:edit, :update]
before_filter :find_user, :only => [:suspend, :unsuspend, :destroy, :purge]
before_filter :admin_required, :only => [:suspend, :unsuspend, :destroy, :purge]
before_filter :check_administrator_role, :only [:index, :suspend, :destroy, :purge]

Со всей этой проверкой состояний для каждого действия, контролируемого UsersController, производительность становится проблемой, поскольку запросы SQL к столбцу Users на моем компьютере занимают более 5 мс.

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

1 Ответ

1 голос
/ 04 января 2009

Абстрагирование множества привилегий в вашу модель Users (возможно, флаги? Полная модель привилегий и linktable могут быть излишними, но, возможно, нет). Сохраните зарегистрированный в настоящее время идентификатор пользователя (и, возможно, несколько других часто используемых вещей) в сеансе. Оставьте один before_filter, называемый :auth, который делает User.find(session[:user_id]) и устанавливает некоторую общеизвестную переменную класса, возможно @loggedinuser, для объекта User. Затем вы выполняете поиск привилегий на @loggedinuser.

...