Rails干掉类似的控制器动作

时间:2012-05-25 00:24:54

标签: ruby-on-rails dry

我有两个独立的控制器继承自Admin::UserBaseController,显示一个可搜索的,可排序的用户表,并使用相同的部分视图。

  • 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 个答案:

答案 0 :(得分: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

然后在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])

让一切变得美好而简洁。

答案 1 :(得分: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

然后只使用该方法代替where

相关问题