質問: Ransackの数値検索については、例えば「Arel.sql("CAST(users.age AS CHAR(8))")」などの記述で可能な状態です。 ransackを使った検索で半角「3」で検索したときに、全角の「3」を持つレコードがヒットするにはどのようにすればいいでしょうか? また逆に、全角「3」で検索したときに、半角「3」も検索対象にしたいです。 自分でトライしたことは、検索語句を受け取ったコントローラーで、送信された語句をもとにして、もう一つ違う語句を作成し、それでも検索するということです。 例えば、半角「3」を送信したとして、コントローラー側で、半角「3」をもとに、全角「3」を作り、「3(半角)と3(全角)」でOR検索ということです。 しかしうまくいきませんでした。 どのようにすればいいでしょうか? よろしくおねがいします!!
回答: RailsというよりDB次第だと思いました MYSQLなら全角半角の差を無視して検索するオプションがあります ``` ransacker :fuzzy_age do |parent| Arel.sql("CAST(users.age AS CHAR(8)) collate utf8_unicode_ci") end ``` Oracleなら TO_SINGLE_BYTEを使って 半角同士で検索するとか?(試してないです) ``` ransacker :fuzzy_age, formatter: proc { |v| '#半角に変換する' } do |parent| Arel.sql("TO_SINGLE_BYTE(CAST(users.age AS CHAR(8)))") end ``` 他のDBでも、オプション任せ or 相互変換のどちらかでいけないでしょうか 補足・理想の話 ただし上記は DB の index が効かず遅くなる可能性があります 氏名検索などなら仕方ないですが、age等の数値前提が可能ならDB側は半角数値で固定するほうがパフォーマンスは良いでしょう 1. DBの既存の値をすべて半角に書き換える 2. DBのカラムを数値型にする 3. 保存時に半角に変換して保存するよう登録処理を修正する ``` ransacker :fuzzy_age, formatter: proc { |v| '#半角に変換する' } do |parent| parent.table[:age] end ```