我正在使用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)
等
答案 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
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] })
顺便说一句,我建议将类别列提取到具有id
和name
列的类别模型中。然后,您可以在绘画中使用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,在控制器中他构建了搜索,我在结果上使用了分页。
我希望它可以帮到某人:)