diff --git a/lib/rom/sql/plugin/pagination.rb b/lib/rom/sql/plugin/pagination.rb index 948c436ba..56a4c2d7b 100644 --- a/lib/rom/sql/plugin/pagination.rb +++ b/lib/rom/sql/plugin/pagination.rb @@ -115,7 +115,7 @@ def self.included(klass) klass.class_eval do defines :per_page - option :pager, default: -> { + option :_pager, default: -> { Pager.new(dataset, per_page: self.class.per_page) } end @@ -131,8 +131,8 @@ def self.included(klass) # # @api public def page(num) - next_pager = pager.at(dataset, num) - new(next_pager.dataset, pager: next_pager) + next_pager = _pager.at(dataset, num) + new(next_pager.dataset, _pager: next_pager) end # Set limit for pagination @@ -144,8 +144,17 @@ def page(num) # # @api public def per_page(num) - next_pager = pager.at(dataset, pager.current_page, num) - new(next_pager.dataset, pager: next_pager) + next_pager = _pager.at(dataset, _pager.current_page, num) + new(next_pager.dataset, _pager: next_pager) + end + + # Return a pager object updated with most up-to-date dataset + # + # @return [Pager] + # + # @api public + def pager + Pager.new(dataset, current_page: _pager.current_page, per_page: _pager.per_page) end end end diff --git a/spec/unit/plugin/pagination_spec.rb b/spec/unit/plugin/pagination_spec.rb index 04c734458..e2012361c 100644 --- a/spec/unit/plugin/pagination_spec.rb +++ b/spec/unit/plugin/pagination_spec.rb @@ -62,6 +62,24 @@ users = container.relations[:users].per_page(9) expect(users.pager.total_pages).to eql(1) end + + it 'returns one page when relation is filtered' do + users = container.relations[:users].per_page(1).where(name: "User 1") + expect(users.pager.total_pages).to eql(1) + + users = container.relations[:users].where(name: "User 1").per_page(1) + expect(users.pager.total_pages).to eql(1) + end + end + + describe "#next_page" do + it "returns nil when there is no next page in filtered relation" do + users = container.relations[:users].per_page(1).where(name: "User 1") + expect(users.pager.next_page).to be(nil) + + users = container.relations[:users].where(name: "User 1").per_page(1) + expect(users.pager.next_page).to be(nil) + end end describe '#pager' do