こんにちは。今回はRuby on RailsのプラグインSimple Column Searchをご紹介します。
さて、Simple Column Searchとは、複数カラムにわたるLIKE検索処理を楽にコーディングできるようにするプラグインです。READMEを読みながら実践してみましょう。
まずはプラグインのインストール(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オプションには以下のものが用意されています。
また、Simple Column Searchプラグインでは、named_scopeによってこの機能を提供しており、標準では"search"というスコープ名がつけられていますが、:nameオプションを指定することでその名前も自分で決めることができます。
さらに、named_scopeを使っているため、後ろでfindによる通常の検索条件を付加することもできます。
Example.search("あいう").all(:conditions => ["created_at > ?", Time.now])
久々の投稿となった今回は、これまた久々にRailsプラグイン紹介をさせていただきました。ところで前回書いたNested AttributesとRJSのネタは続きがあるのですが、いかんせん半年以上の間が空いてしまったので...どうしたもんでしょうか。
(KBMJ 谷)