Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Ransack gem-不区分大小写排序(Rails 4)_Sorting_Ruby On Rails 4_Ransack - Fatal编程技术网

Sorting Ransack gem-不区分大小写排序(Rails 4)

Sorting Ransack gem-不区分大小写排序(Rails 4),sorting,ruby-on-rails-4,ransack,Sorting,Ruby On Rails 4,Ransack,使用RansackGem,我试图在索引页上对一个简单列表进行排序。但是,排序字段name中既有大写值也有小写值。为了使排序有用,排序应该不区分大小写 这是型号供应商: name:string, email:string, address:string, phone:string, fax:string 这是控制器: class VendorsController < ApplicationController def index @search = Vendor.search(pa

使用RansackGem,我试图在索引页上对一个简单列表进行排序。但是,排序字段
name
中既有大写值也有小写值。为了使排序有用,排序应该不区分大小写

这是型号
供应商

name:string, email:string, address:string, phone:string, fax:string
这是控制器:

class VendorsController < ApplicationController

def index
  @search = Vendor.search(params[:q])
  @vendors = @search.result
end

任何建议都将不胜感激。

感谢hd1发布了上述方法。 我在这里发布的是实际的代码——这并不理想,因为这似乎是一个冗长的解决办法。 仍然接受更清洁的建议

def index
  @search = Vendor.search(params[:q])
  @vendors = @search.result

  if params[:q].present?
    params[:q].each do |k, v| 
      if v == 'name asc'
        @vendors = @search.result.sort { |p1, p2| p1.name.downcase <=> p2.name.downcase }
      elsif v == 'name desc'
        @vendors = @search.result.sort { |p2, p1| p1.name.downcase <=> p2.name.downcase }
      end
    end
  end
end
def索引
@search=Vendor.search(参数[:q])
@供应商=@search.result
如果参数[:q],是否存在?
参数[:q]。每个都做| k,v |
如果v==“名称asc”
@供应商=@search.result.sort{| p1,p2 | p1.name.downcase p2.name.downcase}
elsif v==“名称描述”
@供应商=@search.result.sort{| p2,p1 | p1.name.downcase p2.name.downcase}
结束
结束
结束
结束

您正在寻找的是一个定制的“洗劫者”:


10个月,也许太晚了

这解决了我使用posgresql的问题

sort_link @search, 'lowercase(name)', "Name"

您可以使用以下方法一次为模型的所有字符串列解决此问题:

# lib/ransack_object.rb

module RansackObject

  def self.included(base)
    base.columns.each do |column|
      if column.type == :string
        base.ransacker column.name.to_sym, type: :string do
          Arel.sql("lower(#{base.table_name}.#{column.name})")
        end
      end
    end
  end

end
然后在模型中包含“搜索”对象:

class UserWithManyAttributes < ActiveRecord::Base

  include RansackObject

end
class UserWithManyAttributes
Ransack现在有一个不区分大小写的
选项
您可以使用
不区分大小写:false


参考资料:

sorted_list=vendors.sort{a,b | a.name.downcase b.name.downcase}
#试试看,如果需要,请告诉我helps@hd1谢谢你的快速回复!你能再给我一点吗?我试着把它放在控制器的搜索和结果中,但没有成功。还是个新手。尝试向模型中添加一个以小写形式返回名称的访问器,然后在该字段上搜索<代码>def小写字母_name.downcase!结束
并配置ransack,在您的Did try中使用@search.sorts搜索小写的_name字段,但这对我这个级别的人来说是另一个挑战。获取虚拟属性的值很简单,但使用它进行排序似乎需要一些技巧。请与我分享一些代码,如果有一个很好的方法来实现这一点。。。再次感谢。@hd1,感谢你的第一个建议,我至少在工作中得到了它。。。添加答案以便有代码可以查看…您介意解释一下它的作用或工作原理吗?我对“arel_table”的使用感到特别困惑。在处理关联时,它似乎不起作用,例如**sort_link@search,'lowercase(patient.last_name)',“name”这会降低数据库端的大小写,但不会降低搜索词的大小写。如果搜索词已经是小写的,则此选项有效。
sort_link @search, 'lowercase(name)', "Name"
# lib/ransack_object.rb

module RansackObject

  def self.included(base)
    base.columns.each do |column|
      if column.type == :string
        base.ransacker column.name.to_sym, type: :string do
          Arel.sql("lower(#{base.table_name}.#{column.name})")
        end
      end
    end
  end

end
class UserWithManyAttributes < ActiveRecord::Base

  include RansackObject

end