是否可以在分页前按条件过滤?

时间:2010-06-15 00:20:53

标签: ruby-on-rails will-paginate

我在rails 2.3.8和will_paginate插件上使用ruby。

我刚刚注意到,如果我写这样的话:

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

它会起作用。

但是,如果我写这样的话:

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

它不会识别条件。

修改

我开发了一个搜索功能,由于我必须实现的排序功能,我不得不将搜索专长放在模型的方法中,以便每当我需要搜索或按某些方式排序时从控制器调用它字段。

所以,我模型的方法看起来像这样:

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

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

其中“published”和“order_by_rate”被命名为范围,“descend_by_feature”属于“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

我的控制器的动作如下:

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

此语法无法识别模型方法中指定的条件。

编辑2:

感谢您的帖子。更多地测试我的代码我发现如果我在“order_by_rate”之后的Announcement.published.descend_by_featured.order_by_rate :conditions => conditions处写“.all”,在search_by_relevance方法中它会返回正确的查询,但是will_paginate插件会给我以下错误(就在我添加“.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'

首先,我不明白为什么我必须将“.all”添加到查询才能正常工作,其次,我不明白为什么当包含“.all”时,will_paginate将无效。 (我还尝试添加以下代码但不起作用::page => params[:page] || 1)。

此外,如果我在查询中包含“.all”语法,它将返回:

  

SELECT * FROM announcements WHERE   ((标题如“%anuncio%”或   描述如“%anuncio%”))AND   (announcements.state ='已发布')   ORDER BY announcements.featured DESC

如果我不这样做,它将返回:

  

SELECT * FROM announcements WHERE   (announcements.state ='已发布')   ORDER BY announcements.featured DESC

你看到最后一个没有条件吗?这导致了这个问题。

2 个答案:

答案 0 :(得分:0)

我不知道这是否适合您,但您可以像paginate一样使用find,我的意思是:

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

修改

@announcements是一个数组,对吧?

好吧,我发现this帖子和this其他可以帮助你的帖子。

答案 1 :(得分:0)

好吧,我通过在模型的方法中向我的查询添加“.paginate”(而不是“.all”)来解决这个问题,通过参数传递“page”和“per_page”值。在模型中加入分页并不是我的想法,但是......这是我现在的解决方案。如果你想出一个更好的,我会很高兴听到它:)