1

から継承しAdmin::UserBaseController、検索可能でソート可能なユーザーのテーブルを表示し、同じ部分ビューを使用する2つの別個のコントローラーがあります。

  • Admin::UsersController-特定の組織のコンテキスト内でユーザーを表示します。
  • Admin::OrganizationsController-システムのすべてのユーザーを表示します。

Admin ::UsersControllerのインデックスメソッドは次のとおりです。

  def index
    q = "%#{params[:search]}%"
    @users = User.where("first_name like ? or last_name like ? or username like ?", q, q, q).order(sort_column + ' ' + sort_direction).paginate(:page => params[:page])

    respond_to do |format|
      format.html # index.html.erb
      format.json { render :json => @users }
    end
  end

Admin::OrganizationsControllerの編集方法は次のとおりです。

def edit
    @organization = Organization.find(params[:id])
    q = "%#{params[:search]}%"
    @users = @organization.users.where("first_name like ? or last_name like ? or username like ?", q, q, q).order(sort_column + ' ' + sort_direction).paginate(:page => params[:page])
end

@users変数の割り当て方法には、2つの方法の間に多くの類似点があります。それはとの違いでUserあり@organization.users、それだけです。どうすればこれを乾かすことができますか?

4

2 に答える 2

2

だから、これが叫んでいるのはスコープです。これにより、重複するクエリがモデル内の 1 つの場所に取り除かれ、スコープをクラスと関連付けに連鎖させることができます。

class User < ActiveRecord::Base
  scope :search_identity, lambda { |identity| where("first_name like ? or last_name like ? or username like ?", identity, identity, identity) }
  scope :user_order, lambda { |column,direction| order("#{column} #{direction}") }
end

次に、Admin::UsersController で

q = "%#{params[:search]}%"
@users = User.search_identity( q ).user_order( sort_column, sort_direction).paginate(:page => params[:page])

Admin::OrganizationsController で:

q = "%#{params[:search]}%"
@users = @organization.users.search_identity( q ).user_order( sort_column, sort_direction).paginate(:page => params[:page])

すべてを素晴らしく簡潔にします。

于 2012-05-25T01:31:05.007 に答える
0

動く

where("first_name like ? or last_name like ? or username like ?", q, q, q).order(sort_column + ' ' + sort_direction).paginate(:page => params[:page])

User のメソッドへ

そのような:

def self.method_name(q,params)
  where("first_name like ? or last_name like ? or username like ?", q, q, q).order(sort_column + ' ' + sort_direction).paginate(:page => params[:page])
end

次に、そのメソッドを where の代わりに使用します

于 2012-05-25T00:42:27.543 に答える