J'ai réussi à trouver une solution de contournement à cela maintenant. L'action d'index a maintenant une clause "order" avant l'appel à la page et les repas sont ensuite triés et groupés par date. Le bit hackey suivant: @total_pages et @pages sont utilisés dans la vue pour fournir des liens de pagination car l'aide intégrée pour cela ne fonctionne pas avec le hachage de tableaux retourné par @meals. Ca marche (genre de) mais c'est hackey. Déplacer le truc de vue dans une aide aiderait certainement à le nettoyer, ce qui est ma prochaine étape.Comment paginer un hachage de tableaux à l'aide de la gemme Kaminari (ou will_paginate)
def index
@meals = Meal.order('date DESC').page(params[:page]).text_search(params[:query]).sort_by(&:date).reverse.group_by(&:date)
@total_pages = (Meal.all.size/7.to_f).ceil
@pages = ([email protected]_pages).to_a
respond_to do |format|
format.html # index.html.erb
format.json { render json: @meals }
end
fin
je vraiment besoin d'aide sur ce point - il a été me rend fou pendant quelques jours. J'essaie de paginer un hachage de tableaux. J'ai essayé à la fois will_paginate et Kaminari, mais je n'arrive pas à trouver un moyen de paginer le hash résultant.
Je cours Rails 3.2.6, Ruby 1.9.3 et PostgreSQL 9.1.3 fait la recherche ...
Dans mon contrôleur (et en utilisant Kaminari) J'ai:
def index
@meals = Meal.text_search(params[:query]).sort_by(&:date).reverse.group_by(&:date).page(params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @meals }
end
end
Et dans mon modèle, j'ai la recherche suivante:
def self.text_search(query)
if query.present?
where("description @@ :q or meal_time @@ :q", q: query)
else
scoped
end
end
Et dans mon modèle de vue:
<div class="container">
<div class="row">
<%= form_tag meals_path, method: :get, :class => "well form-search" do %>
<%= text_field_tag :query, params[:query],
:class => "span3" %>
<%= submit_tag "Search", name: nil, :class => "btn" %>
<% if current_user %>
<p class="pull-right">
<%= link_to "Add a meal",
new_meal_path,
:class => 'btn btn-success' %>
</p>
<% else %>
<% end %>
<% end %>
</div>
<table class="table table-striped">
<tbody>
<% @meals.each do |date, meals| %>
<tr>
<td>
<h2><%= date.to_s(:day_of_month) %></h2>
<h6><%= date.to_s(:date_and_month) %></h6>
<p><span class="badge badge-warning"><%= pluralize(meals.size, "meal") %></span></p>
</td>
<% meals.each do |meal| %>
<td>
<p>
<strong>
<%= meal.consumed_at.to_s(:just_the_time)%>
<%= meal.meal_time %> —
<%= meal.description %>
</strong>
</p>
<%= link_to "Ingredients", meal_path(meal) %>
</td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
</div>
<%= paginate @meals %>
Cela renvoie l'erreur suivante:
NoMethodError in MealsController#index
undefined method `page' for Hash
Toute aide serait accueillie avec reconnaissance!
Je ne sais rien à propos de Ruby, mais ne paginez-vous pas habituellement dans la fonction de recherche, pas après? Je veux dire que vous obtiendriez TOUS les résultats, puis pagineriez dans le hash! Dans la partie text_search ... Ne devrait-il pas y avoir des commandes "skip" et "limit"? – sinni800
@ sinni800 - merci pour l'aide. J'ai réussi à trouver un moyen de contourner ce problème pour le moment! – user792649
Pourriez-vous poster le travail? –