感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Railsであいまい検索(LIKE)やAND検索を行う

スポンサーリンク

あいまい検索とは、「用語の一部の一致」を探して、一部でもマッチングするものを抽出する検索のこと。
「鈴木」で検索したら、「鈴木美保」、「鈴木亜美」、「鈴木えみ」を検索するようなイメージですね。

Railsのあいまい検索の書き方は、以下の様な感じです。

where("カラム名 like '%検索テキスト%'")

コントローラーは以下のようにコーディングします。

bloggers_controller.rb

  def find
    @datas = []
    if request.post? then
      fstr = params[:fstr]
      @datas = Blogger.where("name like '%" + fstr + "%'")
    end
  end

ここでのポイントは、

if request.post? then
 @word = params[:fstr]
 fstr = params[:fstr]
 @datas = Blogger.where("name like '%" + fstr + "%'")
end

という部分で、ここのBlogger.whereでLIKE検索を行っています。
引数にしているのはリクエストパラメータで受け取った値ですね。


ビューは以下のように書いてみます。

find.html.erb

<table>
  <form method="post" action="/bloggers/find">
  <tr><th>FIND:</th><td><input type="text" name="fstr"></td></tr>
  <tr><th></th><td><input type="submit" value="送信"></td></tr>
  </form>
</table>

<hr />
検索ワード:<%= @word %><br/>
<table>
  <tr><th>ID</th><th>NAME</th><th>PV</th><th>URL</th></tr>
  <% @datas.each do |data| %>
  <tr>
    <td><%= data.id %></td>
    <td><%= data.name %></td>
    <td><%= data.pv %></td>
    <td><%= data.url %></td>
  </tr>
  <% end %>
</table>

<hr />
<a href="/bloggers/index"> << index </a>

上のほうにある、postメソッドでテキストボックスに入れた値をリクエストとして投げています。
で、下の方のテーブルでは、コントローラで詰め込んだ@datasから値を取得して、表示しています。

Railsでは、プレースホルダという機能を利用することもできます。
プレースホルダとは、あらかじめ指定した場所に、別途用意した値をはめこんでテキストを作成するための仕組みです。

コントローラの検索の部分を以下のように変えても、同じように動作します。

@datas = Blogger.where("name like ?","%" + fstr + "%")

表示される画像はこんな感じになります。

f:id:sho322:20140413133350p:plain

では、次に AND検索を実装してみましょう。
RailsでANDとLIKE検索を行うコツみたいなのは、以下のStackOverFlowを参考にしました。
http://stackoverflow.com/questions/4430578/how-to-do-a-like-query-in-arel-and-rails-3

上の画像を見ればわかりますが、「名前」の他に、「PV」とかの値もあるので、「名前」と「PV」で検索してみましょう。
名前はあいまい検索、PVは「以上」で検索します。

コントローラはこんな感じです。

  def find
    @datas = []
    if request.post? then
      @word = params[:fstr]
      
      pv = params[:pv]
      fstr = "%#{params[:fstr]}%"
      @datas = Blogger.where("pv >= ? and name like ?",pv,fstr)
    end
  end

パラメータから、pvと名前を受け取って、"pv >= ? name like ?"とプレースホルダに入れています。
本当はnull値のチェックとかを入れますが、今回は省略します。

これにリクエストを投げるViewは以下のように書きます。

<table>
  <form method="post" action="/bloggers/find">
  <tr><th>名前:</th><td><input type="text" name="fstr"></td></tr>
  <tr><th>PV:</th><td><input type="text" name="pv"></td></tr>
  <tr><th></th><td><input type="submit" value="送信"></td></tr>
  </form>
</table>

<hr />
検索ワード:<%= @word %><br/>
<table>
  <tr><th>ID</th><th>NAME</th><th>PV</th><th>URL</th></tr>
  <% @datas.each do |data| %>
  <tr>
    <td><%= data.id %></td>
    <td><%= data.name %></td>
    <td><%= data.pv %></td>
    <td><%= data.url %></td>
  </tr>
  <% end %>
</table>

<hr />
<a href="/bloggers/index"> << index </a>

名前とPVを指定していますね。

ブラウザで見るとこんな感じになります。

f:id:sho322:20140413133507p:plain

PVが「10000」異常に絞って検索することができました。

<参考文献>
HerokuではじめるRailsプログラミング入門