Top > 開発ガイド > コンポーネント開発逆引きリファレンス > Rubricks検索と連携する
Rubricks検索と連携する
対象バージョン
当ドキュメントはRubricks-0.6.x向けです。
概要
コンポーネントディレクトリに命名規約に沿ったライブラリを配置することで検索システムと連携することができます。
イメージ
使い方
ライブラリの配置
コンポーネントルート直下に検索ライブラリを準備します。検索ライブラリのクラス名は「RubricksSearch」として下さい。 例えば、 Sampleコンポーネントに検索ライブラリを作成する場合、/components/sample/rubricks_search.rbを作成すれば良いことになります。
[/component/sample/rubricks_search.rb] class Sample::RubricksSearch . . . end
必須メソッドの実装
検索ライブラリには以下の3つのメソッドを用意することが必須となります。
| メソッド名 | 説明 |
| target | 検索対象となる項目をRubricks検索コンポーネントに知らせるためのメソッド。 |
| count | Rubricks検索コンポーネントから渡された検索条件に基づく結果の件数を返すためのメソッド。 |
| search | Rubricks検索コンポーネントから渡された検索条件に基づいた検索結果を返すためのメソッド。 |
- targetメソッド
検索対象となる項目を規定します。
引数: なし
戻り値: Hash
| 型 | 説明 |
| Hash | HashのKeyに対象の識別名・Valueにその表示文字列をセットします。 |
例えば、SampleItemというARクラスのposter・title・commentの3つのカラムを検索対象としたい場合は以下のように記述します。
class Sample::RubricksSearch
def target
target = {
'poster' => '投稿者'
'title' => 'タイトル'
'comment' => 'コメント'
}
end
.
.
.
end
この結果、Rubricks検索コンポーネントは下記のようなチェックボックスを出力します。エンドユーザは出力されたチェックボックスから、検索対象としたい項目をチェックして検索を実施することになります。
<input id="ti_poster" class="check" name="ti[]" value="poster" type="checkbox">投稿者 <input id="ti_title" class="check" name="ti[]" value="title" type="checkbox">タイトル <input id="ti_comment" class="check" name="ti[]" value="comment" type="checkbox">コメント
検索対象はコンポーネント側で一意に決めてしまいたい場合は空のHashをリターンして下さい。また、検索対象項目が1つしかない場合はcheckbox ではなくhiddenのパラメータとなります。 checkboxではなくradioで選択させたい場合は、下記のように記述して下さい。
class Sample::RubricksSearch
def target
target = {
:input_type => 'radio',
'poster' => '投稿者'
'title' => 'タイトル'
'comment' => 'コメント'
}
end
.
.
.
end
- countメソッド
Rubricks検索コンポーネントから渡された検索条件に基づいて検索を実施し、その結果の件数をリターンして下さい。
引数: query, ru, target_list
| 引数 | 必須 | 初期値 | 型 | 説明 |
| query | ○ | - | String | ユーザが入力した検索文字列です。 |
| ru | ○ | - | RubricksUser | 検索を実施したユーザのユーザオブジェクトです。 |
| target_list | ○ | - | Array | 検索対象項目の配列です。targetメソッドで規定した検索対象項目のうち、ユーザが選択したものが引数として渡されます。なお、ユーザがチェックボックスを指定しなかった場合には引数が渡されないため、必ずデフォルト値をセットして下さい。 |
戻り値: int
| 型 | 説明 |
| int | 検索結果の件数です。 |
例えば、上述のSampleItemクラスに対して検索を実施する場合は下記のようになります。
class Sample::RubricksSearch
def target
target = {
'poster' => '投稿者'
'title' => 'タイトル'
'comment' => 'コメント'
}
end
def count(query, ru, target_list = ['poster', 'title', 'comment'])
if ru.has_permission?(:sample, :access)
conditions = RubricksLib.query_to_conditions(query, target_list)
return Sample::SampleItem.count(:all, :conditions => conditions)
else
return 0
end
end
.
.
.
end
このサンプルコードには以下の特徴があります。
・ 検索対象に関してはユーザから指定されなかった場合にはデフォルトで投稿者・タイトル・コメントの全てが検索対象になるように指定してあります。
・ コンポーネントに対するアクセス権限に関してはユーザオブジェクトのhas_permission?メソッドを用いて該当コンポーネントのアクセス権限を判定しています。
・ 検索条件に関してはRubricksLibのquery_to_conditionsというヘルパーメソッドを用いて検索条件を生成しています。このメソッドについては後述します。
- searchメソッド
Rubricks検索コンポーネントから渡された検索条件に基づいて検索を実施し、その結果をリターンして下さい。Rubricks検索コンポーネントから渡される引数の意味は下記の通りです。
引数: query, offset, limit, snippet_size, ru, target_list
| 引数 | 必須 | 初期値 | 型 | 説明 |
| query | ○ | - | String | ユーザが入力した検索文字列です。 |
| offset | ○ | - | int | 検索結果のうち、表示に必要な部分の基準点です。 |
| limit | ○ | - | int | 検索結果のうち、表示する件数です。 |
| snippet_size | ○ | - | int | 検索結果の概要の最大文字数です。 |
| ru | ○ | - | RubricksUser | 検索を実施したユーザのユーザオブジェクトです。 |
| target_list | ○ | - | Array | 検索対象項目の配列です。targetメソッドで規定した検索対象項目のうち、ユーザが選択したものが引数として渡されます。なお、ユーザがチェックボックスを指定しなかった場合には引数が渡されないため、必ずデフォルト値をセットして下さい。 |
戻り値: Hash/Array
| 型 | 説明 |
| Hash/Array | 検索結果のレコードを1件につき1つのHashに格納し、Arrayとしてまとめたものをリターンします。 |
Hashに格納する際の必須項目は以下表の通りです。
キー:
| キー | 型 | 説明 |
| :permalink | Options of url_for | 検索結果へのハイパーリンクを指定します。url_forメソッドのオプション(HashもしくはString)で指定してください。 |
| :title | String | 記事のタイトルを指定します。 |
| :author | String | 記事の作者・投稿者を指定します。 |
| :date | DateTime object or Time object | 記事の投稿日を指定します。 |
| :snippet | String | 記事の概要を指定します。 |
※上記の他に、以下のオプションを指定することが可能です。
| :blank | true | 検索結果表示画面のLinkが「target="_blank"」扱いになります。 |
| :popup | Options of url_for | このオプションを指定することで、上述の:permalinkで指定した検索結果にジャンプする前にポップアップウィンドウで簡易表示する画面を挟むことができます。ポップアップウィンドウに表示する内容を描画するためのURLをurl_forメソッドのオプション(HashもしくはString)で指定してください。但し、制約事項としてパラメータ(:params)は指定できません。:controller,:action,:idの指定のみが有効です。 |
例えば、上述のSampleItemクラスに対して検索を実施する場合は下記のようになります。
class Sample::RubricksSearch
def target
target = {
'poster' => '投稿者'
'title' => 'タイトル'
'comment' => 'コメント'
}
end
def count(query, ru, target_list = ['poster', 'title', 'comment'])
if ru.has_permission?(:sample, :access)
conditions = RubricksLib.query_to_conditions(query, target_list)
return Sample::SampleItem.count(:all, :conditions => conditions)
else
return 0
end
end
def search(query, offset, limit, snippet_size, ru, target_list = ['poster', 'title', 'comment'])
result = []
if ru.has_permission?(:sample, :access)
conditions = RubricksLib.query_to_conditions(query, target_list)
si_list = Sample::SampleItem.search(:all, :offset => offset, :limit => limit, :conditions => conditions)
si_list.each do |si|
result << {
:permalink => {:controller => '/sample/index', :main => '_show', :params => {:id => si.id}},
:title => si.title,
:author => si.poster,
:date => si.created_on,
:snippet => si.comment
}
end
end
return result
end
end
受け取る引数の内、初出のものを解説します。
・ offset及びlimitに関してはAR.findのオプションそのものなので、検索条件としてそのまま利用できます。
・ snippet_sizeはこの例では使用しませんでした。
API
コンポーネント内の検索の処理はコンポーネント側で実装して頂くことになります。その際に利用できるヘルパメソッドをいくつか用意してあります。
RubricksLib.query_to_conditions(query, target_list)
- ユーザが入力した検索キーワードからAR.findの検索条件を生成するメソッドです。上述の例でも使用しています。
| 引数 | 必須 | 初期値 | 型 | 説明 |
| query | ○ | - | String | ユーザが入力した検索文字列です。 |
| target_list | ○ | - | Array | 検索対象項目の配列です。targetメソッドで規定した検索対象項目のうち、ユーザが選択したものが引数として渡されます。なお、ユーザがチェックボックスを指定しなかった場合には引数が渡されないため、必ずデフォルト値をセットして下さい。 |
RubricksLib.query_to_hyperestraier_query(query)
- ユーザが入力した検索キーワードからHyperEstraierの検索文字列を生成するメソッドです。acts_as_searchableを利用している場合に有用です。
| 引数 | 必須 | 初期値 | 型 | 説明 |
| query | ○ | - | String | ユーザが入力した検索文字列です。 |
RubricksLib.query_to_regexp_pattern(query)
- ユーザが入力した検索キーワードから正規表現のパターンを生成するメソッドです。
| 引数 | 必須 | 初期値 | 型 | 説明 |
| query | ○ | - | String | ユーザが入力した検索文字列です。 |
Attachments
- system_search.png (22.9 kB) - added by yamaguchi on 03/19/09 14:59:34.

