For a site I’m building with Rails, I wanted to paginate the results of a database query with the built in pagination utilities. However, out of the box, paginate doesn’t take a :limit
option, because that’s used to get a certain number of results per page. This is the workaround I put together. Perhaps there are better ways, but this was quick and efficient.
In the controller:
class StoreController < ApplicationController
# This is for Pagination.
DEFAULT_OPTIONS[:first_n] = nil
This lets you use a new option to paginate, :first_n
(which isn’t the best name, but was the first thing that popped into my head).
Now, you override this method:
def count_collection_for_pagination(model, options)
unless options[:first_n].nil?
return options[:first_n]
else
return model.count(:conditions => options[:conditions],
:joins => options[:join] || options[:joins],
:include => options[:include],
:select => options[:count])
end
end
So, if you only want N results, you then do:
@prod_pages, @products = paginate(:products, :condition => condition, :first_n => 100)
Seems to be pretty quick and simple, so it works for me, although I’m sure a Ruby expert could make it look even nicer.