我正在开发一个rails应用程序,它在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查询在我的机器上占用超过5毫秒。
我只是假设所有这些过滤器都在拖动性能中发挥作用,我想知道如何最好地重构这些以改善数据库的读取。
答案 0 :(得分:1)
将许多特权内容抽象到您的用户模型中(可能是标志?完整的权限模型和链接表可能过度,但可能不是)。将当前登录的用户ID(可能还有其他一些常用的东西)存储到会话中。保留一个名为:auth
的before_filter,它执行User.find(session[:user_id])
并将一些众所周知的类变量(可能是@loggedinuser
)设置为User对象。然后,您在@loggedinuser
上查找权限。