2011年8月24日水曜日

rails meta_whereとmeta_searchを試してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

シンプルな検索をさせるときに便利そうだったので試してみた。

meta_whereはSQL風にかかずにrubyぽくかけるファインダー
meta_searchは簡易的検索の実装。sort機能もある

以下参考サイト

http://ja.asciicasts.com/episodes/251-metawhere-metasearch
http://railscasts.com/episodes/251-metawhere-metasearch
http://metautonomo.us/projects/metawhere/
http://metautonomo.us/projects/metasearch/#security
https://github.com/ryanb/railscasts-episodes/tree/master/episode-251



準備
・gemfile記述
gem "meta_where"
gem "meta_search"

bundle install

・テストデータ
rails g scaffold item name:string price:decimal released_at:datetime
rake db:migrate

indexの表示部分をちょっとかっこよくしておく
<% @items.each do |item| %>
  <tr>
    <td><%= link_to item.name, item %></td>
    <td><%= number_to_currency(item.price) %></td>
    <td><%= item.released_at.strftime("%B %e, %Y") %></td>

●ここからmeta_search
・コントローラのindexを書き換え
def index
   @search = Item.search(params[:search])
   @items = @search.all
end

・ビューのindexの上のほうにsearchフォーム部分を追加
<h1>Listing items</h1>

<%= form_for @search do |f| %>
  <p>
    <%= f.label :name_contains %>
    <%= f.text_field :name_contains %>
  </p>
  <p class="button"><%= f.submit "Search" %></p>
<% end %>

シンボルを:name_containsとすることでnameカラムを対象にsearchできるみたいだ

実際にデータを入れて検索してみる。うまく動いているようだ。部分検索もできている。
and検索はできないようだ。

次に値段のレンジ指定したsearchの実装
・ビューのindexに以下を追加
 <p>
    <%= f.label :price_gte, "Price ranges from" %>
    <%= f.text_field :price_gte, :size => 8 %>
    <%= f.label :price_lte, "to" %>
    <%= f.text_field :price_lte, :size => 8 %>
  </p>

下限の指定は:price_gte、上限は:price_lteを使っている。
gteとlteでmete_whereが使われている

再度確認。priceの下限と上限を指定してsearchボタンをクリックするとちゃんと絞込みができている。
次にソート機能の実装をしてみる。
・ビューのindexのsearchフォームの下に以下を追加
<p>
  Sort by:
  <%= sort_link @search, :name %>
  <%= sort_link @search, :price, :default_order =>:asc %>
  <%= sort_link @search, :released_at , :default_order => :desc %>
</p>

sort_linkを使って カラムを指定してやるとsortするリンクが表示される
defalut_orderで初期の並び方を設定。

再度確認。リンクをクリックするごとに昇順、降順を順番に表示してくれる。
見た目はこんな感じ。



















使う際のセキュリティとしてビュー側からsearchするカラムを指定できることから
ビューがなんらかの問題で書き換えられた場合、想定しないデータが検索されて表示されてしまうこと。その対策はこちらを参照 http://metautonomo.us/projects/metasearch/#security

簡単にシンプルで並び替えや絞込みもできる検索フォームが作れるのがいいですね






0 件のコメント:

コメントを投稿