Top > 開発ガイド > コンポーネント開発Tips集 > 検索との連携

検索との連携

対象バージョン

当ドキュメントは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メソッド

args  => 無し
return => 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メソッド

args  => query, ru, target_list
return => int
Rubricks検索コンポーネントから渡された検索条件に基づいて検索を実施し、その結果の件数をリターンして下さい。Rubricks検索コンポーネントから渡される引数の意味は下記の通りです。

  • query (String)
    ユーザが入力した検索文字列です。
  • ru (RubricksUser)
    検索を実施したユーザのユーザオブジェクトです。
  • target_list (Array)
    検索対象項目の配列です。targetメソッドで規定した検索対象項目のうち、ユーザが選択したものが引数として渡されます。なお、ユーザがチェックボックスを指定しなかった場合には引数が渡されないため、必ずデフォルト値をセットして下さい。

例えば、上述の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メソッド

args  => query, offset, limit, snippet_size, ru, target_list
return => Array
Rubricks検索コンポーネントから渡された検索条件に基づいて検索を実施し、その結果をリターンして下さい。Rubricks検索コンポーネントから渡される引数の意味は下記の通りです。

  • query (String)
    ユーザが入力した検索文字列です。
  • offset (int)
    検索結果のうち、表示に必要な部分の基準点です。
  • limit (int)
    検索結果のうち、表示する件数です。
  • snippet_size (int)
    検索結果の概要の最大文字数です。
  • ru (RubricksUser)
    検索を実施したユーザのユーザオブジェクトです。
  • target_list (Array)
    検索対象項目の配列です。targetメソッドで規定した検索対象項目のうち、ユーザが選択したものが引数として渡されます。なお、ユーザがチェックボックスを指定しなかった場合には引数が渡されないため、必ずデフォルト値をセットして下さい。

例えば、上述の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はこの例では使用しませんでした。

リターンする検索結果については、検索結果のレコードを1件につき1つの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"」扱いになります。

これらの検索結果レコードをArrayとしてまとめたものをリターンして下さい。

ヘルパメソッド

コンポーネント内の検索の処理はコンポーネント側で実装して頂くことになります。その際に利用できるヘルパメソッドをいくつか用意してあります。

  • RubricksLib.query_to_conditions(query, target_list)
    ユーザが入力した検索キーワードからAR.findの検索条件を生成するメソッドです。上述の例でも使用しています。
  • RubricksLib.query_to_hyperestraier_query(query)
    ユーザが入力した検索キーワードからHyperEstraierの検索文字列を生成するメソッドです。acts_as_searchableを利用している場合に有用です。
  • RubricksLib.query_to_regexp_pattern(query)
    ユーザが入力した検索キーワードから正規表現のパターンを生成するメソッドです。