【问题标题】:Is it possible to filter by conditions before paginating?分页前是否可以按条件过滤?
【发布时间】:2010-06-15 00:20:53
【问题描述】:

我正在使用 ruby​​ on rails 2.3.8 和 will_paginate 插件。

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

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:

感谢您的帖子。再测试一下我的代码,我发现如果我在 Announcement.published.descend_by_featured.order_by_rate :conditions => conditions 这一行的“order_by_rate”之后写“.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”语法,它将返回:

选择 * 从announcements 哪里 ((标题如“%anuncio%”或 描述如 "%anuncio%")) 和 (announcements.state = '已发布') ORDER BY Advertisements.featured DESC

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

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

您是否看到最后一个条件中没有包含任何条件?这就是问题所在。

【问题讨论】:

  • 我错过了什么?我的理解是 :conditions 的行为类似于 SQL WHERE 语句,因此从技术上讲,您首先使用标准语法过滤条件……
  • 是的,但在这种情况下它不起作用......
  • 我已经编辑了我的答案...希望对你有帮助:]

标签: ruby-on-rails will-paginate


【解决方案1】:

我不知道这是否适合你,但你可以使用 paginate 就像 find,我的意思是,类似:

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

编辑

@announcements 是一个数组,对吧?

嗯,我找到了 this 的帖子和 this 其他可能对您有帮助的帖子。

【讨论】:

  • 我需要先得到条件过滤的记录,然后再分页。分两步。
  • 嗯。我以为你只是不想加载所有Annoucements
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2023-01-30
    • 2012-07-12
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多