1つのアプローチは、Searchクラスを作成することです。送信時にSearchクラスに送信されるクエリ入力を持つフォームパーシャルを作成します。その後、検索により検索結果のコレクションが表示され、それを別のビューに出力します。Searchクラスを使用すると、検索に追加の機能(追加のモデルと結果をランク付けする方法)を保持できます。
これが骨格の例です...
class Search
attr_accessor :query
def initialize(*args)
self.query = args[0] && args[0][:query] ? args[0][:query] : nil
end
def elements
query.nil? ? [] : query.downcase.split(/ /)
end
def class_a
class_a_objects = []
...some code that finds the objects you are searching for...
return class_a_objects.uniq
end
def class_b
class_a_objects = []
...some code that finds the objects you are searching for...
return issuers.uniq
end
def class_c
..
end
....
def results
class_a_objects + class_b_objects + class_c_objects
end
end
各クラスの検索コードで、「elements」メソッドを使用して個々のクエリオブジェクトを検索します。
フォームの場合
= form_tag("/search", :method => :get) do
= text_field 'search', :query
= submit_tag 'search'
Routes.rb
match '/search' => "search#query", :as => 'search'
次に、「クエリ」アクションを持つ検索コントローラー。このコントローラーでは、単に
class SearchController
def query
@results = Search.new(:query => params[:search][:query] ).results
end
end
このコントローラーアクションのビュー「検索」を追加します。ここで、@resultsをレンダリングします。結果は、さまざまなクラスの個々のオブジェクトのコレクションになるため、ビューは各アイテムを個別に処理でき、オブジェクトクラスに基づいて追加のパーシャルで処理できます。