在Controller中重构before_filters

时间:2009-01-02 21:01:02

标签: ruby-on-rails model-view-controller aasm

我正在开发一个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毫秒。

我只是假设所有这些过滤器都在拖动性能中发挥作用,我想知道如何最好地重构这些以改善数据库的读取。

1 个答案:

答案 0 :(得分:1)

将许多特权内容抽象到您的用户模型中(可能是标志?完整的权限模型和链接表可能过度,但可能不是)。将当前登录的用户ID(可能还有其他一些常用的东西)存储到会话中。保留一个名为:auth的before_filter,它执行User.find(session[:user_id])并将一些众所周知的类变量(可能是@loggedinuser)设置为User对象。然后,您在@loggedinuser上查找权限。