1

我有两个独立的控制器,它们继承自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,就是这样。我怎么把它弄干?

4

2 回答 2

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])

让一切变得简洁明了。

于 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])

到用户中的方法

如:

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 回答