Rails,searchlogic选择带复选框的类别

时间:2009-07-25 01:01:43

标签: ruby-on-rails ruby

我正在使用searchlogic搜索一些画作。每幅画都属于一个类别。我想要做的是在我的搜索表单中添加多个复选框,以便用户可以标记多个类别。 (与or一起使用)这可能与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)

4 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

你能不能看看你的情况是否适用?如果没有人知道更好的解决方案,我愿意花点时间:

我期待听到您的反馈意见;)!

在app / helper / 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
在app / helper / 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

答案 2 :(得分: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] })

顺便说一句,我建议将类别列提取到具有idname列的类别模型中。然后,您可以在绘画中使用category_id来链接关联。这样就可以对数据库进行规范化,例如,您可以轻松地重命名和添加类别。你也可以使用Category.all循环遍历它们。

答案 3 :(得分: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

我的对象提供了一个字段category_id,在控制器中他构建了搜索,我在结果上使用了分页。

我希望它可以帮到某人:)