def paginate_by_sql(sql, options)
pagenum = options.fetch(:page) { raise ArgumentError, ":page parameter required" } || 1
per_page = options[:per_page] || self.per_page
total = options[:total_entries]
WillPaginate::Collection.create(pagenum, per_page, total) do |pager|
query = sanitize_sql(sql.dup)
original_query = query.dup
oracle = self.connection.adapter_name =~ /^(oracle|oci$)/i
if oracle
query = "SELECT * FROM (\nSELECT rownum rnum, a.* FROM (\#{query}) a\nWHERE rownum <= \#{pager.offset + pager.per_page}\n) WHERE rnum >= \#{pager.offset}\n"
else
query << " LIMIT #{pager.per_page} OFFSET #{pager.offset}"
end
pager.replace find_by_sql(query)
unless pager.total_entries
count_query = original_query.sub /\bORDER\s+BY\s+[\w`,\s.]+$/mi, ''
count_query = "SELECT COUNT(*) FROM (#{count_query})"
count_query << ' AS count_table' unless oracle
pager.total_entries = count_by_sql(count_query)
end
end
end