Część z Was już pewnie zauważyła, że w nowej wersji Mongoida (2.0.2) zrezygnowano z will_paginate. Will_paginate okazał się niezbyt efektywny, ponieważ nie obsługiwał opcji limit i kilku innych rzeczy, w skutek czego paginacja dużych zbiorów stawała się bardzo powolna. Zamiast tego jako podstawową metodę paginacji dla nowych wersji Mongoida zaleca się Kaminari. O Kaminari już parokrotnie wspominałem. Jest świetne. Niestety - nie jest aż tak wesoło kiedy trzeba je połączyć z aplikacją która nie jest napisana w Railsach. Zwykłe:
gem 'kaminari' # i ew. gdzieś tam w kodzie jakby kogoś naszło require 'kaminari'
na niewiele się zda.
Brak Kaminari skutkuje tego typu błędami:
NoMethodError: undefined method `page' for Note:Class /home/mencio/Rails/app/webui/app/controllers/notes.rb:7:in `GET /notes' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:340:in `call' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:340:in `route' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/sinatra-1.1.3/lib/sinatra/base.rb:649:in `instance_eval' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/sinatra-1.1.3/lib/sinatra/base.rb:649:in `route_eval' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:605:in `route!' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:605:in `catch' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:605:in `route!' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:596:in `catch' /home/mencio/.rvm/gems/ruby-1.8.7-p299@app/gems/padrino-core-0.9.19/lib/padrino-core/application/routing.rb:596:in `route!' # cd ...
Kaminari "z pudełka" średnio współpracuje z (całkiem fajną) mieszanką Padrino (frameworku zbudowanego na Sinatrze) oraz Mongoida. Rozwiązanie jest jednak bajecznie proste (chociaż niezbyt eleganckie). Tworzymy sobie plik config/preload/kaminari.rb a w nim umieszczamy poniższy kod:
require 'kaminari/railtie' require 'kaminari/engine' require 'kaminari/config' require 'kaminari/helpers/action_view_extension' require 'kaminari/helpers/paginator' require 'kaminari/models/page_scope_methods' require 'kaminari/models/configuration_methods' require 'kaminari/models/mongoid_extension' ::Mongoid::Document.send :include, Kaminari::MongoidExtension::Document ::Mongoid::Criteria.send :include, Kaminari::MongoidExtension::Criteria
Następnie w pliku config/boot.rb umieszczamy (w sekcji Padrino.before_load):
require File.expand_path("config/preload/kaminari", Padrino.root)
March 19, 2014 — 13:47
Ładuje się ładnie, ale paginacja tak na prawdę nie działa. Zwraca całą kolekcję.
March 19, 2014 — 13:49
Ten post ma 3 lata i jest bardzo duża szansa, że coś zmieniło się już w Mongoidzie i innych gemach.