使用Ransack gem,我正在尝试在索引页面上对一个简单的列表进行排序。但是,排序字段name
中同时包含大写和小写值。为了使它们有用,排序应该不区分大小写。
这是模型Vendor
:
name:string, email:string, address:string, phone:string, fax:string
这是控制器:
class VendorsController < ApplicationController
def index
@search = Vendor.search(params[:q])
@vendors = @search.result
end
观点:
/index.html.slim
tr
th = sort_link @search, :name, "Name"
th = sort_link @search, :email, "Company Email"
th = sort_link @search, :address, "Address"
非常感谢任何建议。
答案 0 :(得分:6)
您正在寻找的是定制的“Ransacker”:
class Vendor < ActiveRecord::Base
ransacker :name_case_insensitive, type: :string do
arel_table[:name].lower
end
end
观点:
th = sort_link(@q, :name_case_insensitive)
答案 1 :(得分:1)
这解决了我的postgresql问题
sort_link @search, 'lowercase(name)', "Name"
答案 2 :(得分:0)
感谢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
答案 3 :(得分:0)
您可以使用此方法立即为模型的所有字符串列解决此问题:
# 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
然后在模型中包含ransack对象:
class UserWithManyAttributes < ActiveRecord::Base
include RansackObject
end
答案 4 :(得分:0)
Ransack现在有一个case_insensitive
选项
您可以使用case_insensitive: false
推荐人:https://github.com/activerecord-hackery/ransack/wiki/Custom-Predicates