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検索コンポーネントに知らせるためのメソッド。
countRubricks検索コンポーネントから渡された検索条件に基づく結果の件数を返すためのメソッド。
searchRubricks検索コンポーネントから渡された検索条件に基づいた検索結果を返すためのメソッド。
  • targetメソッド

検索対象となる項目を規定します。
引数: なし


戻り値: Hash

説明
HashHashの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に格納する際の必須項目は以下表の通りです。

キー:

キー説明
:permalinkOptions of url_for検索結果へのハイパーリンクを指定します。url_forメソッドのオプション(HashもしくはString)で指定してください。
:titleString記事のタイトルを指定します。
:authorString記事の作者・投稿者を指定します。
:dateDateTime object or Time object記事の投稿日を指定します。
:snippetString記事の概要を指定します。

※上記の他に、以下のオプションを指定することが可能です。

:blanktrue検索結果表示画面のLinkが「target="_blank"」扱いになります。
:popupOptions 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