Search code examples
ruby-on-railswill-paginatefind-by-sql

Is it possible to combine will_paginate with find_by_sql?


In my Rails application I want to use the will_paginate gem to paginate on my SQL query. Is that possible? I tried doing something like this but it didn't work:

@users = User.find_by_sql("
    SELECT u.id, u.first_name, u.last_name, 
     CASE 
      WHEN r.user_accepted =1 AND (r.friend_accepted =0 || r.friend_accepted IS NULL)
       .........").paginate(
                  :page => @page, :per_page => @per_page, 
                  :conditions => conditions_hash,
                  :order => 'first_name ASC')

If not, can you recommend a way around this? I don't want to have to write my own pagination.


Solution

  • Use paginate_by_sql, i.e.

    sql = " SELECT * 
            FROM   users
            WHERE  created_at >= ?
            ORDER  BY created_at DESC "
    
    @users = User.paginate_by_sql(
      [sql, 2.weeks.ago],
      page: @page,
      per_page: @per_page
    )
    

    As a general rule any finder can be paginated by replacing the find* with paginate*.