If you’re unfamiliar with Ransack, it’s basically an advanced search form generator for Rails. It allows you to add fields to the form for things like category_id_eq
and title_cont
and it will “magically” query the database.
The only real problem with Ransack is the lack of documentation. Almost every time I had a problem I ended up looking on Stack Overflow or through the Github Issues
page. Both of those sites are easy to search through which wasn’t a hindrance, but it took a long time to figure out simple things.
One of those simple things, which I’m not the only one that had a problem with, was creating a select field for a has_many :through
or has_and_belongs_to_many
association.
The Setup
Here are the three models that I have in place. It’s a basic setup for has_many :through
allowing multiple categories being assigned to products and vice versa. For more information take a look at Rails Guide on ActiveRecord associations.
# product.rb
class Product < ActiveRecord::Base
has_many :categorizations
has_many :categories, :through => :categorizations
end
# category.rb
class Category < ActiveRecord::Base
has_many :categorizations
has_many :products, :through => :categorizations
end
# categorization.rb
class Categorization < ActiveRecord::Base
belongs_to :category
belongs_to :product
end
The Ransack Way
For Ransack to pick up on the association you have to provide the “associated” models plural name. For instance, if we are building a search form for the products page then the field name would be categories_id_eq
. Here’s an example form
<%= search_form_for @query do |f| %>
<%= f.label :categories_id_eq, "Category" %>
<%= f.collection_select :categories_id_eq, Category.order(:title), :id, :title %>
<%= f.submit "Filter Products" %>
<% end %>