2009-01-02 44 views
0

我正在開發一個Rails應用程序,它有一大堆在users_controller中的過濾器,它們查找由Acts提供的用戶狀態角色作爲狀態機。 他們是這個樣子:在控制器中重構before_filters

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查詢到用戶列在我的機器上以向上爲5ms。

我只是假設所有這些過濾器在拖動性能中扮演着角色,我想知道如何最好地重構這些來改善從數據庫中讀取數據。

回答

1

將用戶模型中的許多特權抽象出來(可能是標誌?一個完整的特權模型和鏈接表可能是矯枉過正的,但也許不是)。將當前登錄的用戶ID(可能還有其他一些常用的東西)存儲到會話中。留下一個名爲:auth的before_filter,它執行User.find(session[:user_id])並將一些着名的類變量(可能是@loggedinuser)設置爲User對象。然後你可以查詢@loggedinuser的權限。