2012-04-23

データ量が多いテーブルにActiveScaffoldを使う時、検索はfield_searchがよさげ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
データ量が多いテーブルにActiveScaffoldを使うときの場合です。

たとえば、以下のようなテーブルがあるとします。

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
コメントを投稿