0

Acts asStateMachineによって提供されるユーザーのステートフルロールを検索するusers_controllerにたくさんのbeforeフィルターがあるrailsアプリに取り組んでいます。彼らはこのように見えます:

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ミリ秒以上かかります。

これらのフィルターのすべてがドラッグパフォーマンスに関与していると想定しているだけであり、データベースからの読み取りを改善するためにこれらをリファクタリングするのに最適な方法を考えています。

4

1 に答える 1

1

多くの特権をユーザーモデルに抽象化します(フラグ、おそらく?完全な特権モデルとリンクテーブルはやり過ぎかもしれませんが、そうではないかもしれません)。現在ログインしているユーザーのID(およびおそらく他のよく使用されるもの)をセッションに保存します。と呼ばれるbefore_filterを1つ残します。:authこれは、を実行し、User.find(session[:user_id])よく知られているクラス変数(おそらく@loggedinuser、)をUserオブジェクトに設定します。@loggedinuser次に、 for特権を検索します。

于 2009-01-04T04:20:22.693 に答える