Rails5のactiveRecordで正規表現を使用したSQLを実行しようとすると、エラーになります。
sqlite> SELECT "notes".* FROM "notes" WHERE content REGEXP 'hoge' ;
Error: no such function: REGEXP
activeRecordでも同様です。
[13] pry(main)> Note.all
...
#<Note:0x000055701e73c740 id: 9, title: "dev", content: "hogefuga", user_id: 3, created_at: Sat, 28 Jul 2018 23:27:58 UTC +00:00, updated_at: Sat, 28 Jul 2018 23:27:58 UTC +00:00>,
#<Note:0x000055701e73c560 id: 10, title: "dev_", content: "hogehoge", user_id: 3, created_at: Sat, 28 Jul 2018 23:28:21 UTC +00:00, updated_at: Sat, 28 Jul 2018 23:28:21 UTC +00:00>]
# 一見出来ているように見える
[14] pry(main)> Note.where("content REGEXP ?", 'hoge')
Note Load (0.3ms) SELECT "notes".* FROM "notes" WHERE (content REGEXP 'hoge')
Note Load (0.3ms) SELECT "notes".* FROM "notes" WHERE (content REGEXP 'hoge') LIMIT ? [["LIMIT", 11]]
=> #<Note::ActiveRecord_Relation:0x3ff536212788>
# しかし取得できていない
[15] pry(main)> Note.where("content REGEXP ?", 'hoge')[0]
Note Load (0.3ms) SELECT "notes".* FROM "notes" WHERE (content REGEXP 'hoge')
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such function: REGEXP: SELECT "notes".* FROM "notes" WHERE (content REGEXP 'hoge')
from /home/yuis/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:91:in `initialize'
で、調べると、どうも情報が錯綜してて…。
まとめると、
- Sqlite3自体は正規表現に対応している => How do I use regex in a SQLite query? – Stack Overflow
- sentOSのSqliteは正規表現に対応していない => SQLite で正規表現を使う – しょぼんメモリ (´・ω・`)
- 最新のRailsのActiveRecordはLIKE検索や正規表現検索に対応していない => Ruby – Railsで正規表現を使い、一致したレコードを取り出す方法を教えていただけないでしょうか?(127161)|teratail
- activeRecordは無理だが、Arelなら正規表現検索が可能 =>
Regexp
などActiveRecordでメソッドが用意されていない標準SQLの演算子を清く正しく使う。 – ンンンパ
見事に分かりませんね。
何がどうなってるんだか…。
解決策としては、やはり、どうしてもLIKE検索とかREGEXPを使いたいなら、SQliteからmysqlなどに移行するってのが一番かなと思います。