Sorting Ransack gem-不区分大小写排序(Rails 4)
使用RansackGem,我试图在索引页上对一个简单列表进行排序。但是,排序字段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
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