2009-07-25 10 views
2

私はsearchlogicを使って絵を検索しています。各絵は一つのカテゴリーに属する。私がしたいのは、複数のチェックボックスを検索フォームに追加することで、ユーザーは複数のカテゴリをマークできます。 (またはで結合されています)これはsearchlogicで可能ですか?私が探していますクエリは、このようなものです:Rails、searchlogicカテゴリをチェックボックスで選択してください

SELECT * FROM paintings WHERE category LIKE "white" OR category LIKE "red"... 

f.check_box :category (white) 
f.check_box :category (black) 
f.check_box :category (red) 
f.check_box :category (green) 

など

答えて

5

ここでそれを行うには、スーパー大型の簡単な方法です(検索対象を想定している@search):

f.check_box :category_equals_any, {:name => "search[category_equals_any][]"}, "white" 
f.check_box :category_equals_any, {:name => "search[category_equals_any][]"}, "black" 
f.check_box :category_equals_any, {:name => "search[category_equals_any][]"}, "red" 
f.check_box :category_equals_any, {:name => "search[category_equals_any][]"}, "green" 
+0

ありがとう.....将来から書く=) –

1

そのようなことは、あなたのケースで動作するかどうかを確認してくださいもらえますか?私は誰ももっと良い解決法を知らないなら、これに少し時間を入れても構わない:

あなたのフィードバックをお待ちしています;)!アプリ/ヘルパーでアプリ/ヘルパー/ conditions_builder.rb

class ConditionsBuilder < ActionView::Helpers::FormBuilder 
    def multiple_select(collection, possibilities) 
    content = [] 
    id = "#{object_name}[#{collection}][]" 
    content << @template.hidden_field_tag(id, "") 

    ids = Set.new(self.object.send(collection)) 
    possibilities.each do |p, label| 
     uid = @template.sanitize_to_id("#{id}#{p}") 
     checked = ids.include?(p) 
     content << @template.content_tag("div", 
        @template.check_box_tag(id, p, checked, :id => uid) + " " + 
        @template.label_tag(uid, label)) 
    end 

    return content.join(" ") 
    end 
end 

/application.helper追加:

def conditions_form(&blk) 
    form_for @search, :builder => ConditionsBuilder, &blk 
end 

あなたのビューで追加:(私の場合、私はHAMLを使用)私の場合は

- conditions_form do |f| 
    - f.fields_for @search.conditions do |s| 
    = s.label 'Name' 
    = s.text_field 'name_contains' 
    = s.multiple_select :state_equals, ['open', 'active', 'gone'].collect{|s| [s, _state(s)]} 
    = f.submit _("Search"), :class => 'buttons' 

私はいくつかのデフォルト値を設定します(これはそれを行うための最善の方法であるかどうかわからない):

unless params[:search] 
    @search.conditions.state_equals = ['open', 'active'] 
    end 
1

POSTリクエストによって検索が行われますか?もしそうなら、あなたはこのように...

<% for category in %w[white red black] %> 
    <p> 
    <%= check_box_tag "categories[]", category, (params[:categories] && params[:categories].include?(category)) %> 
    <%=h category %> 
    </p> 
<% end %> 

をそれを行う。そして、このような検索を行うことができます。..

Painting.all(:conditions => { :category => params[:categories] }) 

ところで、私はidを持っているカテゴリーのモデルにカテゴリ欄を抽出するお勧めしますカラムはnameです。ペインティングでcategory_idを使用して関連付けをリンクすることができます。このようにして、データベースは正規化され、たとえば簡単にカテゴリの名前を変更して追加することができます。また、すべてCategory.allでループすることもできます。

0

私は、私は簡単な使用私のコントローラでビュー

 <%= f.collection_select :category_id_equals, Category.all, :id, :name, :include_blank => true %> 

でこれを使用

@search = Offer.search(params[:search]) 
    @search.order ||= "descend_by_id"   
    @offers = @search.all.paginate(:per_page => 20, :page => params[:page]) 
    @offers_count = @search.count 

マイオブジェクトのオファーは、彼が検索を構築するコントローラに、1フィールドCATEGORY_IDを持って、私は目の上にページ付けを使用結果。

私はそれが誰かを助けることを願っています:)

関連する問題