こんにちは。今回はRuby on RailsのプラグインSimple Column Searchをご紹介します。

さて、Simple Column Searchとは、複数カラムにわたるLIKE検索処理を楽にコーディングできるようにするプラグインです。READMEを読みながら実践してみましょう。


今回の環境

  • Ruby 1.8.7
  • Rails 2.3.5
  • SQLite3 (アダプタはsqlite3-ruby)

やってみよう

まずはプラグインのインストール(gitがPATHに追加されているか確認してください)

$ ./script/plugin install git://github.com/jqr/simple_column_search.git

モデル作成(名称がかなりいい加減になっていますがご了承ください...)

$ ./script/generate model Example text1:text text2:text text3:text text4:text 

生成したモデル(app/models/example.rb)に、simple_column_searchメソッドを記述します。引数に、対象となるカラムを書いてください。

class Example < ActiveRecord::Base
 simple_column_search :text1, :text2, :text3, :text4
end

これまたものすごくいい加減ですが、テストデータとして、test/fixtures/examples.ymlを以下のように編集しました。

one:
 text1: あいうえお
 text2: かきくけこ
 text3: さしすせそ
 text4: たちつてと

two:
 text1: なにぬねの
 text2: はひふへほ
 text3: まみむめも
 text4: やゆよ

three:
 text1: らりるれろ
 text2: わをん
 text3: あいうえお
 text4: かきくけこ

マイグレートします。

$ rake db:migrate db:fixtures:load

今回は、script/console上で実際に吐き出させるSQLを見ながら確認しましょう。

>> ActiveRecord::Base.logger = Logger.new(STDOUT);reload!
Reloading...
=> true
>> Example.search("あいう")
  Example Load (0.6ms)   SELECT * FROM "examples" WHERE ((examples.text1 LIKE 'あいう%' OR examples.text2 LIKE 'あいう%' OR examples.text3 LIKE 'あいう%' OR examples.text4 LIKE 'あいう%'))
=> [#<example id: 113629430, text1: "らりるれろ", text2: "わをん", text3: "あいうえお", text4: "かきくけこ",created_at: "2010-01-19 16:51:05", updated_at: 16:51:05">, #<example id: 980190962, text1: "あいうえお", text2: "かき くけこ", text3: "さしすせそ", text4: "たちつてと", created_at: "2010-01-19 16:51:05", updated_at:"2010-01-19 16:51:05">]

といった具合に、simple_column_searchメソッドで設定したカラムにたいしてLIKE検索していることが分かります。しかしこれだと前方一致しか対応していない!READMEには書いてありませんが、プラグインのソースを見ると、simple_column_searchを定義する際に、:matchオプションに値を渡すことで、一致方法を指定することができます。

class Example < ActiveRecord::Base
  simple_column_search :text1, :text2, :text3, :text4、:match =>:middle
end

上記のように書き換えてもう一回実行すると...

Example.search("あいう")
  Example Load (0.7ms)   SELECT * FROM "examples" WHERE ((examples.text1 LIKE '%あいう%' OR examples.text2 LIKE '%あいう%' OR examples.text3 LIKE '%あいう%' OR examples.text4 LIKE '%あいう%'))
=> [#<example id: 113629430, text1: "らりるれろ", text2: "わをん", text3: "あいうえお", text4: "かきくけこ", created_at: "2010-01-19 16:51:05", updated_at: 16:51:05">, #<example id: 980190962, text1: "あいうえお", text2: "かきくけこ", text3: "さしすせそ", text4: "たちつてと", created_at: "2010-01-19 16:51:05", updated_at: 16:51:05">]

おお、部分一致になりましたね。


オプション

ちなみに、:matchオプションには以下のものが用意されています。

  • :start 前方一致
  • :middle 部分一致
  • :end 後方一致
  • :exact 完全一致

また、Simple Column Searchプラグインでは、named_scopeによってこの機能を提供しており、標準では"search"というスコープ名がつけられていますが、:nameオプションを指定することでその名前も自分で決めることができます。


さらに、named_scopeを使っているため、後ろでfindによる通常の検索条件を付加することもできます。

Example.search("あいう").all(:conditions => ["created_at > ?", Time.now])


最後に

久々の投稿となった今回は、これまた久々にRailsプラグイン紹介をさせていただきました。ところで前回書いたNested AttributesとRJSのネタは続きがあるのですが、いかんせん半年以上の間が空いてしまったので...どうしたもんでしょうか。

(KBMJ 谷)

ブックマークに追加する

.
web開発ならKBMJ
Rubyでのwebシステム開発は
実績豊富なKBMJにお任せ下さい
iPhone開発
iPhone開発は
KBMJにお任せ下さい
ブラウザゲーム エインヘリアル
ブラウザゲーム「エインへリアル」
αテスター募集中
オープンソースECパッケージ エレコマ
オープンソースECパッケージ
「エレコマ」

プロフィール

KBMJ 谷
KBMJ 谷
KBMJの谷と申します。

このブログではRailsプラグインやらRailsのこの機能をなんとなく使ってみたという報告やらを書いています。わりとニッチなところばかりついている感がありますが、お役に立てば光栄です。

ちなみに、ブログタイトルはDoRuby!初期の命名規則の名残です...。"tnの中身"とはなんなんでしょ...。

■開発環境
OS
・会社ではMac OS X
・自宅では基本的にUbuntu(VirtualBox上)です。
エディタ
・vimにrails.vimとminibufexplorerをのっけてます。

最近チェックした記事

最新記事

アーカイブ

アクセスランキング

KBMJのWebソリューション
Ruby on railsの開発ならKBMJ
株式会社ケイビーエムジェイ