#
# Here is a SQL Server halfway decent working pagination I recently
wrote. Out of the box Rails
# pagination was not working very well at all. I found little on the
internet and thought
# if I could give something back to the Rails community in some way,
that would be cool.
# It was hastily written and there''s at least one bug on the
pagination link for page 2.
# I also think that ODBC driver for SQL Server might be better than
ADO
#
# I put the code in application.rb
class MyPagination
def links()
start = @cur_page - 2
lend = @cur_page + 2
start = 1 if (start < 0)
lend = @num_pages if (lend > @num_pages)
range = start..lend
list = range.to_a
# needs to eval to ''..'', use a do nothing method like cap()
etc
dot = ''"..".capitalize''
list = [1,dot] + list if start != 1
list += [dot,@num_pages] if lend != @num_pages
arr = []
prev = 0
list.each do |pag|
pstr = pag.to_s
prfx = ""
if (pag.class != String) && (pag != @cur_page)
str = "link_to " + "''" + pstr +
"''"
@url.each do |ky,val|
str += ",:#{ky.to_s} => ''#{val}''"
end
str += ", :page => ''#{pag}''"
#puts "add #{str} to arr"
arr << str
else
arr << pstr
end
end
arr
end
def recs()
@recs
end
def initialize(parm)
@parm = parm
@pkey = parm[:pkey]
@rec_class = parm[:rec]
@url = parm[:url]
end
def pages()
nil
end
def page_count
@num_pages
end
def paginate (page_sz, page_wanted, order)
page_wanted = 1 if !page_wanted
page = nil
if @rec_class
if @parm[:conditions]
puts "cond: #{@parm[:conditions]}"
size = @rec_class.count(:conditions => @parm[:conditions])
else
size = @rec_class.count
end
@num_pages = size / page_sz
@last_page_sz = size.remainder(page_sz)
if @last_page_sz > 0
@num_pages += 1
end
puts "call get"
get_page(page_sz, page_wanted, order)
end
end
private
def get_page(page_sz,page_wanted, order)
=begin
SELECT TOP 50 *
FROM mytab
WHERE (EndUser NOT IN
(SELECT TOP 15000 enduser
FROM mytab
ORDER BY enduser))
ORDER BY EndUser
=end
page_wanted = 1 if !page_wanted
@cur_page = page_wanted
recs_wanted = page_sz
recs_wanted = @last_page_sz if page_wanted == @num_pages
puts "page_sz:#{page_sz} last_sz:#{@last_page_sz}
page:#{page_wanted} recs_wanted:#{recs_wanted}"
block_sz = ((page_wanted - 1) * page_sz)
#block_sz += recs_wanted if page_sz != recs_wanted
rec_name = @rec_class.table_name
order_clause = ""
order_clause = "order by #{order}" if order
cond2 = ""
cond1 = ""
if @parm[:conditions]
cond2 = @parm[:conditions]
cond1 = cond2
cond1 += " and " if page_wanted.to_i > 1
cond2 = "where " + cond2
end
inner_sql = ""
if page_wanted.to_i > 1
inner_sql = " not in " +
" (select top #{block_sz} #{@pkey} " +
" from #{rec_name} " + cond2 + " " + order_clause +
") "
end
sql "select top #{recs_wanted} * " +
" from #{rec_name} "
if cond1 != ""
sql += "where #{cond1} "
end
if inner_sql != ""
sql += " (#{@pkey} " + inner_sql + ") "
end
sql += " " + order_clause
puts sql
@recs = @rec_class.find_by_sql(sql)
puts "got #{@recs.size} records"
end
end
###################################################################
#
# Controller example:
def index
page = params[:page]
=begin
@pages, @rec = paginate(:MyRec,
:order => "account DESC",
:per_page => 50)
=end
@pages = MyPagination.new(:rec => Account, :pkey =>
''AccountID'' , :url => {:controller =>
''account''}, :conditions =>
"status = ''corrected''")
page = params[:page].to_i if params[:page]
@pages.paginate(50,page , "accountNum Desc")
@recs = @pages.recs()
end
####################################################33
# template example
<% if @pages && @pages.page_count > 1 %>
<br>
PAGES
<% @pages.links.each do |lnk| %>
<%= eval lnk %>
<% end %>
<br>
<% end %>
<% if @recs %>
<%= render(:partial => ''account'') %>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---