Search code examples
ruby-on-railsruby-on-rails-plugins

will_paginate without use of activerecord


I apologize if this is a trivial question or my understanding of rails is weak.

I have 2 actions in my controller, index and refine_data.

index fetches and displays all the data from a database table.

refine_data weeds out unwanted data using regex and returns a subset of the data.

Controller looks like:

def index
    Result.paginate :per_page => 5, :page => params[:page], :order => 'created_at DESC'
end

def refine_data
   results = Result.all
   new_results = get_subset(results)
   redirect_to :action => 'index'
end

I would like to redirect the refine_data action to the same view (index) with new_results.

As new_results are not from the database table (or model), how do I go about constructing my paginate?


Solution

  • I was not successful in getting will_paginate to work by creating my own find method. I was almost successful but not quite.

    Here's what I've tried: In Controller:

    def refine_data
     Result.paginate_refined_data :per_page => 5, :page => params[:page], :order => 'created_at DESC', :exclude =>"somestring"
    end
    

    In Model:

    def find_refined_data(args)
      exclude_string = args[:exclude];
      new_results = do_some_work_and_exclude_records(@results,exclude_string)
    end
    

    will_paginate had trouble with me passing an additional parameter :exclude which it did not understand.

    The simplest solution for me was to create my own WillPaginate::Collection object.

    So here's how mine works now:

    #The method name does not cause will_paginate to intercept and try to do its magic.
    def new_find_refined_data(args)
      exclude_string = args[:exclude];
      new_results = do_some_work_and_exclude_records(@results,exclude_string)
      @entries = WillPaginate::Collection.create(1, args[:per_page]) do |pager|
      # inject the result array into the paginated collection:
      pager.replace(new_results)
    
      unless pager.total_entries
        # the pager didn't manage to guess the total count, do it manually
        pager.total_entries = new_results.length
      end
    end
    
    end
    

    Hope this will help any of the guys facing the same problem: