[英]Ransack gem - Case insensitive search
使用 Ransack gem,我想這樣做
>> User.search(first_name_i_cont: 'Rya').result.to_sql
=> SELECT "users".* FROM "users" WHERE (UPPER("users"."first_name") LIKE UPPER('%Rya%'))
但是這個方法還行不通。
所以我試圖弄清楚,有沒有其他方法可以做到我得到了一些關於如何做的信息
//in model
ransacker :ig_case, formatter: proc { |v| v.mb_chars.upcase.to_s } do |parent|
Arel::Nodes::NamedFunction.new('UPPER',[parent.table[:firstname]])
end
//in config/ranrack.rb
Ransack.configure do |config|
config.add_predicate 'ig_case', # Name your predicate
arel_predicate: 'matches',
formatter: proc { |v| "%#{v.to_s.gsub(/([\\|\%|.])/, '\\\\\\1').mb_chars.upcase}%"},
validator: proc { |v| v.present? },
compounds: true,
type: :string
end
// use way
User.search({ firstname_or_lastname_ig_case: "ABC"}).result.to_sql
=> "SELECT `Users`.* FROM `Users` WHERE ((UPPER(`users`.`firstname`) LIKE '%ABC%' OR (`users`.`lastname`) LIKE '%ABC%'))"
幾個小時后,我發現當我以模型方式使用時,每次只能得到一個大寫的字段。
如果我以配置方式選擇,我可以將所有字段都大寫,但我無法獲得這樣的 sql 'UPPER("users"."first_name")'
有什么解決辦法嗎? 我真的很感謝。
您需要通過執行以下操作來覆蓋適配器中的 Arel:
module Arel
module Nodes
%w{
IDoesNotMatch
IMatches
}.each do |name|
const_set name, Class.new(Binary)
end
end
module Predications
def i_matches other
Nodes::IMatches.new self, other
end
def i_does_not_match other
Nodes::IDoesNotMatch.new self, other
end
end
module Visitors
class ToSql < Arel::Visitors::Visitor
def visit_Arel_Nodes_IDoesNotMatch o
"UPPER(#{visit o.left}) NOT LIKE UPPER(#{visit o.right})"
end
def visit_Arel_Nodes_IMatches o
"UPPER(#{visit o.left}) LIKE UPPER(#{visit o.right})"
end
end
class Dot < Arel::Visitors::Visitor
alias :visit_Arel_Nodes_IMatches :binary
alias :visit_Arel_Nodes_IDoesNotMatch :binary
end
class DepthFirst < Visitor
unless method_defined?(:visit_Arel_Nodes_InfixOperation)
alias :visit_Arel_Nodes_InfixOperation :binary
alias :visit_Arel_Nodes_IMatches :binary
alias :visit_Arel_Nodes_IDoesNotMatch :binary
end
end
end
end
除此之外,您還需要提供謂詞的方法。
這是我解決您問題的 gem 的分支: https : //github.com/Kartstig/ransack
我有一個 PR 被關閉,因為它可能破壞了其他適配器到目前為止它在我的應用程序中運行良好: https : //github.com/activerecord-hackery/ransack/pull/405
另請注意,如果您有任何索引列,它們將被忽略,因為您使用的是 UPPER。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.