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

时间:2014-02-09 04:46:26

标签: sorting ruby-on-rails-4 ransack

使用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"

非常感谢任何建议。

5 个答案:

答案 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)

10个月,也许为时已晚!!

这解决了我的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