2011-09-22 8 views
6

Sto costruendo una sezione di notizie sul mio personalizzato rotaie sito ed utilizza will_paginate per l'impaginazione. ora mi chiedevo come posso specificare uno scostamento personalizzato per la prima pagina con will_paginate. qualcosa di simile:get will_paginate per definire un offset sulla prima pagina

@featured_news = Post.first 
@news = Post.offset(1).paginate(:page => params[:page]) 

ho bisogno del ultime notizie-entry di essere speciale e non essere inclusi negli oggetti @news.

come posso ottenere questo?

grazie per il vostro tempo!

risposta

9

will_paginate ridefinisce tutte le condizioni di query offset e limit, per ottenere le righe di una pagina specifica. Vedo due opzioni per voi:

Il brutto: approfittare del fatto che le opere will_paginate su collezioni, e utilizzare questa sintassi (sarà caricare tutte le tavolo però)

@news = Post.offset(1).all.paginate(:page => params[:page]) 

Quello più a lungo : forchetta la gemma will_paginate in modo che possa gestire gli offset personalizzati. Non ho provato, ma qualcosa di simile dovrebbe funzionare (le modifiche apportate al gioiello sono evidenziate)

# will_paginate/lib/will_paginate/active_record.rb 

module Pagination 
    def paginate(options) 
    options = options.dup 
    pagenum = options.fetch(:page) { raise ArgumentError, ":page parameter required" } 
    per_page = options.delete(:per_page) || self.per_page 
    total = options.delete(:total_entries) 

    ####################################### 
    custom_offset = options.delete(:offset) 
    ####################################### 

    count_options = options.delete(:count) 
    options.delete(:page) 

    ####################################################### 
    # rel = limit(per_page.to_i).page(pagenum) 
    rel = limit(per_page.to_i).page(pagenum, custom_offset) 
    ####################################################### 

    rel = rel.apply_finder_options(options) if options.any? 
    rel.wp_count_options = count_options if count_options 
    rel.total_entries = total.to_i   unless total.blank? 
    rel 
    end 

    ################################ 
    # def page(num) 
    def page(num, custom_offset = 0) 
    ################################ 
    rel = scoped.extending(RelationMethods) 
    pagenum = ::WillPaginate::PageNumber(num.nil? ? 1 : num) 
    per_page = rel.limit_value || self.per_page 
    ################################################################## 
    # rel = rel.offset(pagenum.to_offset(per_page).to_i) 
    rel = rel.offset(pagenum.to_offset(per_page).to_i + custom_offset) 
    ################################################################## 
    rel = rel.limit(per_page) unless rel.limit_value 
    rel.current_page = pagenum 
    rel 
    end 
end 

Questo dovrebbe consentire di utilizzare questa sintassi:

@news = Post.paginate(:page => params[:page], :offset => 1) 
+0

impressionante! Grazie! Ho creato una forcella se qualcun altro ha bisogno di questo: https://github.com/opetznick/will_paginate –

Problemi correlati