2014-02-09 43 views
2

使用Ransack gem,我试图对索引页面上的简单列表进行排序。但是,在排序字段name中同时存在大写和小写值。为了使它们排序有用,排序应该不区分大小写。Ransack gem - 不区分大小写的排序(Rails 4)

这是模型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

'sorted_list = vendors.sort {| a,b | a.name.downcase <=> b.name.downcase}'#试试,让我知道它是否有帮助 – hd1

+0

@ hd1感谢您的快速回复!你能否多给我多一点?我试着把它放在控制器的搜索和结果中,但没有运气。仍然是一个新手。 – Luke

+0

尝试向您的模型中添加一个访问器,该访问器将名称返回为小写字母并在该字段上搜索? 'def lowercase_name name.downcase! end'并配置ransack以在您的[controller]中使用@ search.sorts搜索lowercase_name字段(http://techbrownbags.wordpress.com/2014/01/17/rails-ajax-search-sort-paginate-with-ransack -kaminari /) – hd1

回答

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 
4

什么你要找的是一个自定义 “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

您是否介意解释它的作用或工作原理?我对使用'arel_table'特别困惑。 – sPaz

0

10月份,也许为时已晚!

这解决了我的问题posgresql

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

在处理关联时似乎不起作用,例如** sort_link @search,'小写字母(patient.last_name)',“名称” –

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 

然后包括在模型中洗劫对象:

class UserWithManyAttributes < ActiveRecord::Base 

    include RansackObject 

end 
+0

这样做的目的是降低数据库端而不是搜索项。如果搜索词已经小写,这将起作用。 – RailinginDFW