我有一个User
模型,我使用范围搜索用户+对结果进行排序。例如,选择名称以“...”开头的用户按升序排列。这个范围工作正常:
scope :like, ->(like) { where("name like ?", "#{like}%")}
scope :order_by, ->(order_by) { order("#{order_by} ASC") }
但是如果我想在选定的字段上对用户进行排序并选择订单类型(ASC / DESC)呢?我试过这样的事情:
scope :like, ->(like, filter) { where("#{filter} like ?", "#{like}%")}
scope :order_by, ->(order_by) { order("#{order_by} #{order_type}") }
...但发生此错误:wrong number of arguments (1 for 2)
。
但是,服务器日志中的所有参数似乎都是正确的:
Parameters: {"utf8"=>"✓", "filter"=>["email"], "like"=>"ex", "order_by"=>"email",
"order_type"=>"DESC", "commit"=>" Search "}
我怎样才能让它发挥作用?感谢您的支持!
PS:users_controller.rb:
include Filterable
...
def index
@users = User.filter(params.slice(:filter, :like, :order_by)).paginate(page: params[:page], per_page: 40)
end
filterable.rb 是所有过滤逻辑所在的模块:
extend ActiveSupport::Concern
module ClassMethods
def filter(filtering_params)
results = self.where(nil)
filtering_params.each do |key, value|
results = results.public_send(key, value) if value.present?
end
results
end
end