views:

41

answers:

2

I'm using ruby on rails 2.3.8 and will_paginate plugin.

I've just noticed that if I write something like this:

Announcement.paginate :page => params[:page], :per_page => 10, :conditions => some_condition

it will work.

But, if I write something like this:

announcements = Announcement.all :conditions => some_condition
@ann = announcements.paginate :page => params[:page], :per_page => 10

it won't recognize conditions.

EDIT:

I've developed a Search functionality and, due to a Sort functionality I had to implement, I had to put the search feat inside a model's method to call it from the controller every time I need either to search or sort by some field.

So, my model's methods look like this:

  def self.search_by_relevance(words)
    conditions = get_search_conditions(words)

    Announcement.published.descend_by_featured.order_by_rate :conditions => conditions
  end

where "published" and "order_by_rate" are named scopes and "descend_by_feature" belongs to "searchlogic" gem.

  def self.get_search_conditions(words)
    unless words.empty? or words.nil?
      conditions = ''

      words.each do |word|

        if conditions.nil? or conditions.empty?
          conditions = '(title  like "%' + word + '%" or description  like "%' + word + '%")'
        else
          conditions += ' and (title  like "%' + word + '%" or description  like "%' + word + '%")'
        end
      end

      conditions
    end
  end

My controller's action looks like this:

def search
  @announcements = Announcement.search_by_relevance(params[:txtSearch].to_s.split).paginate :page => params[:page], :per_page => 10 unless params[:txtSearch].nil? or params[:txtSearch].empty?
end

This syntax won't recognize the conditions specified in the model's method.

EDIT 2:

Thanks for the posts. Testing my code a little more I found out that if I write ".all" right after "order_by_rate" at this line Announcement.published.descend_by_featured.order_by_rate :conditions => conditions, in search_by_relevance method it will return the correct query, but will_paginate plugin will give me the following error(just if I add ".all"):

NoMethodError in AnnouncementsController#search

undefined method `to_i' for {:page=>nil, :per_page=>10}:Hash

D:/Proyectos/Cursometro/www/vendor/plugins/will_paginate/lib/will_paginate/collection.rb:15:in `initialize'
D:/Proyectos/Cursometro/www/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb:37:in `new'
D:/Proyectos/Cursometro/www/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb:37:in `paginate'
D:/Proyectos/Cursometro/www/app/controllers/announcements_controller.rb:276:in `search'

First of all, I don't understand why I have to add the ".all" to the query to work right, and second, I don't see why will_paginate won't work when I include ".all"(I also tried to add the following code but didn't work: :page => params[:page] || 1).

Also, if I include the ".all" syntax to the query, it will return:

SELECT * FROM announcements WHERE ((title like "%anuncio%" or description like "%anuncio%")) AND (announcements.state = 'published') ORDER BY announcements.featured DESC

If I don't, it will return:

SELECT * FROM announcements WHERE (announcements.state = 'published') ORDER BY announcements.featured DESC

Do you see that no conditions are being included in the last one? This is causing the problem.

A: 

I don't know if this will work for you, but you can use paginate just like find, I mean, something like:

@announcements = Announcement.paginate_all_by_id params[:id], 
   :page => params[:page], :per_page => 10

Edit

@announcements is an array, right?

Well, I found this post and this other one that may help you.

j.
I need to first get the records filtered by the conditions and then paginate them. In two steps.
Brian Roisentul
Hmm. I thought you just didn't want to load all `Annoucements`
j.
I've edited my post with updated info.
Brian Roisentul
A: 

Well, I kind of solve this by adding ".paginate"(instead of ".all") to my query in the model's method, passing by parameters the "page" and "per_page" values. It was not my idea to include pagination in models, but well...it's the solution I have for now. If you come up with a better one, I'll be glad to hear it :)

Brian Roisentul