Rails / DBのカラムを結合した文字列で検索する

Shunsuke Sawada

Railsというか、PostgreSQLだよねこれは。
ファーストネームとラストネームというカラムがあって、その両方を合わせた状態で検索したことはたまにある。

なぜなら

ruby
1
User.where('first_name is like ?', "%#{name}%")

こういう感じだと

Shunsuke はヒットしても Sawada Shunsukeにはヒットしないから。
当たり前だけど。

  
こんな感じでいけた。

ruby
1
2
3
keyword = "%#{keyword.downcase}%"
User.where("lower(users.first_name) like ? OR lower(users.last_name) like ? OR concat_ws(' ', lower(first_name), lower(last_name)) like ?", keyword, keyword, keyword)

concat_ws とっても便利。
以上!

参考

PostgreSQL: Documentation: 9.5: Aggregate Functions

mysql - Rails where fields concatenated like search query - Stack Overflow

Shunsuke Sawada

おすすめの記事

Railsを4.2にバージョンアップしたら、Vagrantのローカル開発環境にアクセスできなくなった問題
Railsのバリデーションエラー後にレイアウトが崩れるとき
acts-as-taggable-on タグを表示させる順番を決めたい