めちゃくちゃ曖昧に理解していたこんな文
検索用メソッドで出てくるこんな文。めちゃくちゃ曖昧に理解していたので、復習します。
@users = User.where('name LIKE ?', "%#{params[:name]}%")
('name LIKE ?', "%#{params[:name]}%")
はどういう意味かというと...(ちゃんとRailsガイドに書いてあった)
検索に使う語句が可変である時の書き方らしい。
第一引数(name LIKE ?
)の?
の部分が、第二引数(%#{params[:name]}%
)と置き換えられる。
そして、where
では、上と下の書き方は同じ結果が得られる。
@users = User.where(name: 'sato')
@users = User.where("name = 'sato'")
# どちらもidが1のデータが得られる
発行されるSQLは若干異なるが、それぞれこんな感じ。
SELECT `users`.* FROM `users` WHERE `users`.`name` = 'sato';
SELECT `users`.* FROM `users` WHERE (name = 'sato');
User.where('id = 1')
のid = 1
が、
SQL文のWHERE (id = 1)
に入っているイメージか。
**【注】**この書き方はSQLインジェクションの可能性があるので、実際には書かない用が良い。
SQL
一方で、SQLでのLIKE
句はこのように使う。
SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '検索文字';
↑ちなみに、これは「完全一致」の時
-
'%検索文字列'
...前方一致 -
'検索文字列%'
...後方一致 -
'%検索文字列%'
...部分一致
改めて、最初の文と合わせてみる
では、改めて、最初の文を眺めてみる。
@users = User.where('name LIKE ?', "%#{params[:name]}%")
この時、仮に**「sato」**という文字列がparams[:name]
として渡ってきていると仮定すると、
@users = User.where('name LIKE ?', "%sato%")
となり、
SELECT `users`.* FROM `users` WHERE (name LIKE '%sato%');
このようなSQLが発行され、name
が**「sato」**さんのデータだけが抽出される。
追記:LIKE句で複数単語検索をしたい場合
今回、実現したいことはLIKEでの複数単語検索だったので、LIKE
句の複数単語検索ではどのようなSQLが発行されるのか調べてみました。
例えば、住所録の中から%山%
さんと%川%
さんをOR検索で探したい時には、
SELECT * FROM users WHERE name LIKE '%山%'
OR name LIKE '%川%';
らしいので、
Railsで複数単語検索を実現するには、キーワードを配列に入れて、each
で回して、それぞれで、下記の処理をすれば良さそうですね^^
@users = User.where('name LIKE ?', "%#{params[:name]}%")
続きは次回、実装します〜