2011-12-18 22 views
14

ho provatoMongoid impaginazione

@posts = Post.page(params[:page]).per_page(10) 

e

@posts = Post.paginate(:page => 1, :per_page => 10)  

ma nessuno metodo funziona

undefined method `page' for Post:Class 

undefined method `paginate' for Post:Class 

Come si fa a fare l'impaginazione con mongoid?

+0

Basta usare qualche libreria per impaginare con MongoDB. Puoi usare: gem 'will_paginate' e gem "will_paginate_mongoid" – ThienSuBS

risposta

10

Si dovrebbe usare Kaminari https://github.com/amatsuda/kaminari

+1

Ottengo gli stessi errori quando uso mongoid. Non esiste un metodo di pagina. – Dogweather

+0

hai riavviato il server dopo i binari g kaminari: config? –

+2

Kaminari funziona perfettamente per me con Rails 4.0.0, Mongoid 4.0.0. –

4

Questo funziona bene per me:

@posts = Post.paginate(:page => 1, :limit => 10).desc(:_id) 

desc(:_id) viene aggiunto in modo che tutti i messaggi potrebbero essere elencate per prime.

+1

Questo ha funzionato per me dopo aver aggiunto 'gem 'mongoid-pagination'' al mio' Gemfile'. – Leopd

1

cosa stupida, ma ha funzionato per me in Sinatra dopo ho aggiunto require 'mongoid-pagination' a app.rb

+0

~ 1 anno da quando, preferisco kaminari –

2

un po 'tardi, ma per chiunque altro alla ricerca, ho trovato 'will_paginate_mongoid'

https://github.com/lucasas/will_paginate_mongoid

davvero dritto in avanti e consente di semplicemente fare

collection.skip(20).limit(10) 
+0

Il modo giusto è [kaminari] (https://github.com/amatsuda/kaminari). – yanychar

+0

Se per qualche ragione hai bisogno di usare 'will_paginate' ed esegui' rails-4', 'will_paginate_mongoid' non funziona l'ultima volta che ho controllato. La soluzione è posizionare [mongoid_paginator.rb] (https://raw.github.com/lucasas/will_paginate_mongoid/master/lib/will_paginate_mongoid/mongoid_paginator.rb) in 'app/models/concerns', rimuovere l'esterno' modulo WillPaginateMongoid' e quindi 'include MongoidPaginator' nella classe del modello. – yanychar

3

Sempre utilizzando will_paginate va bene anche

questa discussione c'è stesso problema: undefined method `paginate' for Array on Rails 3 with mongoid

Il punto principale per correggere l'errore è di aggiungere questa linea prima che la libreria di controllo chiamata paginate:

require 'will_paginate/array' 

Va aggiunto file di configurazione, se di default usi mongoid per l'intero progetto.

Spero che la spiegazione sia utile.

Riferimento origine gemma origine: https://github.com/mislav/will_paginate/wiki/Backwards-incompatibility nella sezione "WillPaginate :: Raccolta".

P/S: questo è solo un modo per aggirare se la query non è molto ampia. Se vuoi prestazioni migliori, proviamo con lo , custom will_pagination gem o con un'altra gemma di paginazione che supportava Mongoid come kaminari.

+0

Perché dovremmo aggiungere "/ array" !!! – RubyOnRails

+0

Penso che la versione di origine di will_paginate non supportasse database no-sql come Mongoid, quindi chiamare il nucleo di base di questa gemma risolverà questo problema considerando il record del database come normali array, non il formato speciale di database sql come MySQL, SQLite, .. . –

0

Diffusione diversi anni più tardi, nel caso in cui qualcun altro deve affrontare la stessa sfida.

kaminari-mongoid è stato rilasciato nel 2016 ed è attualmente gestito.

https://github.com/kaminari/kaminari-mongoid

Tutta la bontà Kaminiari per Mongoid ed un'appropriata gestione del Mongoid::Criteria risultati, che era probabilmente la causa dell'errore del PO.