たとえば、以下のようなテーブルがあるとします。
table名:logs
カラム
id
ip_address
user
page
普通にActiveScaffoldを設定すると検索は、テキストボックス一つ表示され
ここに10.10.10.10とか入れた場合、以下のようなSQLが発行されます。
select id from logs where ip_address like '%10.10.10.10% or user like '%10.10.10.10% or page like '%10.10.10.10%
データ量が少ないときは、一つの条件で複数のカラムを探すので便利なのですが
データ量が多くなるとindexが効かないので遅くなっていきます。
そんなときは、通常の検索のsearchではなくて、field_searchを使うのがよさげです。
field_searchの場合は、各カラム毎に検索用のテキストボックスが表示され、それぞれ個別に条件を指定することになります。
デフォルトではsearchと同じような検索になってしまうのですが、設定で完全一致にできてindexを効かせることができるようになります。
以下は、field_searchの設定例です。
class LogController < ApplicationController active_scaffold :logs do |config| config.label = "ログ情報" config.actions.exclude :search config.actions.add :field_search config.columns = [:ip_address, :user, :page] config.columns[:ip_address].label = "IPアドレス" config.columns[:user].label = "ユーザ" config.columns[:page].label = "ページ" config.show.columns << [:created_at,:updated_at] config.field_search.columns = [:ip_address,:user,:page] #ここで完全一致検索に設定 config.field_search.text_search = false end end
0 件のコメント:
コメントを投稿