Используя гем Ransack, я хочу сделать так
>> 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")'
Есть ли решение? Я действительно очень благодарен.