我有两个独立的控制器继承自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
的区别,就是这样。我该如何干这个?
答案 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