2010-06-07 4 views
2

J'ai un groupe d'actifs, appelons-les "praticiens". J'affiche ces praticiens dans l'en-tête d'une interface de calendrier. Il y a 7 colonnes dans le calendrier. 7 colonnes = 7 praticiens par vue/page. En ce moment:Rails paginez les éléments du tableau un par un au lieu de page par page

si la première page montre les praticiens 1-7, quand vous allez à la page suivante, vous verrez les praticiens 8-15, page suivante 16-23, etc., etc.

Je me demande comment pager les pratiquants de sorte que si la première page montre les pratiquants 1-7, la page suivante montrera les pratiquants 2-8, puis 3-9, etc. etc.

J'apprécierais énormément de vous aider offre. voici le code des rails avec lequel je travaille.

meilleures salutations,

harris Novick

# get the default sort order 
sort_order = RESOURCE_SORT_ORDER 

# if we've been given asset ids, start our list with them 
unless params[:asset_ids].blank? 
    params[:asset_ids] = params[:asset_ids].values unless params[:asset_ids].is_a?(Array) 
    sort_order = "#{params[:asset_ids].collect{|id| "service_provider_resources.id = #{id} DESC"}.join(",")}, #{sort_order}" 
end 

@asset_set = @provider.active_resources(:include => {:active_services => :latest_approved_version}).paginate(
    :per_page => RESOURCES_IN_DAY_VIEW, 
    :page => params[:page], 
    :order => sort_order 
) 

Répondre

0

Je pense que LIMIT fonctionnera pour vous. Je ne sais pas à l'aide, mais vous pouvez la pagination essayer de suivre

LIMIT params[:page], 7 

Où params [: page] est le numéro de la page, Donc, pour la page 1, il affichera 7 lignes de 1 à savoir 1-7 Smilarly, pour la page 2 il montrera 7 rangées de 2 à savoir 2-8

1

Bonne question! Je suppose que c'est une chose que WillPaginate ne comprend pas vraiment. Je vais regarder le code de WillPaginate ici, mais je n'ai pas testé cette solution. Si vous avez l'intention de l'essayer, laissez-moi savoir si cela a fonctionné pour vous.

La logique est bien séparée, en WillPaginate::Collection. Vous devez modifier le comportement des méthodes offset et total_entries=. Vous pouvez le faire avec le sous-classement, mais cela signifie que vous ne pouvez plus utiliser le finder spécial paginate, malheureusement. (Il a WillPaginate::Collection hardcoded.)

Vous pourriez avoir quelque chose comme ce qui suit, peut-être dans votre lib/:

class SlidingWindowCollection < WillPaginate::Collection 
    def offset 
    current_page - 1 
    end 

    def total_entries=(number) 
    @total_entries = number.to_i 
    @total_pages = [@total_entries - per_page, 1].max 
    end 
end 

Et puis, votre code d'exemple ressemblerait à ceci:

@asset_set_scope = @provider.active_resources(:include => {:active_services => :latest_approved_version}) 
@asset_set = SlidingWindowCollection.create(params[:page], RESOURCES_IN_DAY_VIEW, @asset_set_scope.count) do |pager| 
    pager.replace(@asset_set_scope.all(:offset => pager.offset, :limit => pager.per_page, :order => sort_order)) 
end 

L'utilisation est un peu plus compliqué, je suppose. Tous les trucs supplémentaires sont normalement pris en charge par le finder spécial paginate, tels que la détermination du nombre total d'entrées et la sélection des bonnes entrées. Je suppose que vous pourriez créer une aide si c'est quelque chose que vous avez l'intention de faire souvent.

Questions connexes