質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1138閲覧

ransackを使った検索で、入力が半角英数字のものを、データベースにある全角英数字にもヒットさせたい!また逆も。

say4hatii8

総合スコア28

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/12/01 12:31

Ransackの数値検索については、例えば「Arel.sql("CAST(users.age AS CHAR(8))")」などの記述で可能な状態です。

ransackを使った検索で半角「3」で検索したときに、全角の「3」を持つレコードがヒットするにはどのようにすればいいでしょうか?
また逆に、全角「3」で検索したときに、半角「3」も検索対象にしたいです。

自分でトライしたことは、検索語句を受け取ったコントローラーで、送信された語句をもとにして、もう一つ違う語句を作成し、それでも検索するということです。

例えば、半角「3」を送信したとして、コントローラー側で、半角「3」をもとに、全角「3」を作り、「3(半角)と3(全角)」でOR検索ということです。

しかしうまくいきませんでした。

どのようにすればいいでしょうか?
よろしくおねがいします!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RailsというよりDB次第だと思いました

MYSQLなら全角半角の差を無視して検索するオプションがあります

ruby

1ransacker :fuzzy_age do |parent| 2 Arel.sql("CAST(users.age AS CHAR(8)) collate utf8_unicode_ci") 3end

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. 保存時に半角に変換して保存するよう登録処理を修正する

ruby

1ransacker :fuzzy_age, formatter: proc { |v| '#半角に変換する' } do |parent| 2 parent.table[:age] 3end

投稿2018/12/03 02:38

Ighrs

総合スコア656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

say4hatii8

2018/12/03 06:14

ご回答ありがとうございます。 しかし、「collate utf8_unicode_ci」を追記しても、 全角「33」で検索しても、半角「33」がヒットしませんでした。 わたしももう一度調べてみます。 宜しくお願い致します。
Ighrs

2018/12/03 07:53

ransacker で定義したキーを使っていますか? User.search(fuzzy_age_eq: '33').result => 追加定義した曖昧検索 ransacker は上書きではなく新しい定義なので本来のgradeに対して行うと効きません User.search(age_eq: '33').result => 数値検索だけど引数が数字ではないためage=0検索になります
say4hatii8

2018/12/04 11:37

Ighrsさん、私はhttps://teratail.com/questions/158501の質問をし、回答を頂いておりました。 同じrailsアプリ内(コード)に、今回の半角、全角を実装したいと思いました。 開発DBにsqliteを使用していたので、最初の回答の「collate utf8_unicode_ci」を追記しても意味がないということですね。ちなみに「collate nocase」でもうまくいきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問