2012-05-25 58 views
1

我有兩個單獨的控制器,從Admin::UserBaseController繼承,顯示一個可搜索,可排序的用戶表,並使用相同的部分視圖。Rails DRY向上類似的控制器操作

  • 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變量。這是User@organization.users的差異,就是這樣。我如何幹這個?

回答

2

那麼這尖叫聲是範圍。這將重複查詢移除到模型中的單個位置,並使您能夠將範圍鏈接到類和關聯上。

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 

然後在管理:: UsersController

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

在管理:: OrganizationsController:

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

使一切好的和簡潔。

+0

範圍正在改變我的人生。找到其他地方也可以使用它們。謝謝你的提示。 – retailevolved

0

移動

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

一種方法,在用戶

如:

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 

就用這種方法代替了哪裏