Ransack: Search with Multiple Checkboxes (Rails)
I've been using the outstanding Ransack gem to enable search for a recent project. Ransack provides a tremendous amount of flexibility in a straightforward manner, but it took me a bit to understand how to search a single field across multiple values selected via checkboxes. My approach follows.
(Note that the field I was searching contained a serialized array of data, not to make life more difficult)
To start, a simplified model:
class Zoo < ActiveRecord::Base
has\_many :animals
end
class Animal < ActiveRecord::Base
belongs\_to :zoo # we'll assume an animal can only belong to one zoo
validates\_presence\_of :name
end
Next, the controller, which is pretty much out-of-the-box from the Ransack documentation:
class ZoosController < ApplicationController
def search # or index
@search = Zoo.search(params\[:q\])
@zoos = @search.result(distinct: true)
end
end
And finally, the magic is really in the view:
<%= search_form_for @search, url: search_zoos_url do |f| %>
<% Animal.all.uniq.each do |animal| %>
# the check_box helper will not work as effectively here
<%= check_box_tag('q[animals_name_cont_any][]', animal.name) %>
<%= animal.name %>
<% end %>
<%= f.submit "Search" %>
<% end %>
The key is the name of the check box field. We are passing an array and also using Ransack's cont_any
predicate, which searches for any records whose name field contains one of the selected names.