nish
nish

Reputation: 7280

Ruby on Rails: Grouping search results by category

I am working on a RoR WebApp. I'm trying to group results on the search page based on their taxonomy. What I want to do is to show a header for a category and list all results under that category. Something like:

CAT 1
products

CAT2
products

CAT3
.
.

I am trying using the following code:

<% if products.any? %>               #products is the list of search results
  <%= render :partial=> 'product_listing_feature', :locals => {:scope => scope, :scope_type => scope_type} %>
  <div id="ql_product"></div>
  <div class="product_rows">
      <%taxons.each do |taxon|%>      # taxons contains the list of unique categories in products
        <div class = "product_row">
          <h1><%=taxon%></h1>
          <% taxonProducts = Array.new %>
          <% products.each do |product| %>
            <%@ptaxon = product.get_taxonomy%>
            <%if @ptaxon == taxon%>
              <% taxonProducts.push(product) %>
            <% end %>
          <% end %>
            <div class ="featured_product_list">
              <ul class = "featured_products">
                <div class = "page">
                  <%= render :partial=> 'product_listing', :locals=>{:collection=> taxonProducts} %>        
                </div>
              </ul>
            </div>
        </div>
      <% end %>
  </div>
<% end %>

Surprisingly it starts the 2nd category from a new row, but the following categories appeared jumbled up, something like

CAT1
products

CAT2
products CAT3
products

This picture would give a better idea.

I am really surprised why it works only for one iteration. Could someone please help me fix this. Thanks a lot

Upvotes: 0

Views: 424

Answers (1)

user229044
user229044

Reputation: 239382

Way, way too much logic for a view. Just use group_by in your controller, which will give you a mapping of names to arrays of products:

products = Product.includes(:taxon).group_by { |p| p.taxon.name }

Upvotes: 4

Related Questions