3

我正在调用一个非常简单的函数,但似乎无法弄清楚发生了什么。(我正在使用 rails 3.0.3 和 'will_paginate' gem 的 master 分支)。我有以下代码:

  results = Article.search(params) # returns an array of articles
  @search_results = results.paginate :page => params[:page],  :per_page=>8, :order => order_clause

无论我使用什么 order_clause(例如 'article_title desc' 和 'article_title asc'),结果总是相同的顺序。所以当我检查使用类似的东西时@search_results[0],元素总是相同的。在我看来,它们显然也总是相同的。我完全错过了什么吗?

我敢肯定这很傻,但我整晚都在用头撞墙。任何帮助将非常感激!

编辑添加:搜索子句执行以下操作:

def self.search(params)
    full_text_search(params[:query].to_s).
    category_search(params[:article_category].blank? ? '' : params[:article_category][:name]).
    payout_search(params[:payout_direction], params[:payout_value]).
    length_search(params[:length_direction], params[:length_value]).
    pending.
    distinct.
    all
  end

其中每个人都是基于搜索逻辑的函数,如下所示:

#scopes
scope :text_search, lambda {|query|
    {
      :joins => "INNER JOIN users ON users.id IN (articles.writer_id, articles.buyer_id)",
      :conditions => ["(articles.article_title LIKE :query) OR
                       (articles.description LIKE :query) OR
                       (users.first_name LIKE :query) OR
                       (users.last_name LIKE :query)", { :query => "%#{query}%" }]
    }
  }
  scope :distinct, :select => "distinct articles.*"
#methods

    def self.payout_search(dir, val)
        return no_op if val.blank?
        send("payment_amount_#{dir.gsub(/\s+/,'').underscore}", val)
      end

      def self.length_search(dir, val)
        return no_op if val.blank?
        send("min_words_#{dir.gsub(/\s+/,'').underscore}", val)
      end

谢谢。

4

1 回答 1

8

如果您查看 will_paginate github 页面中的示例,您会发现他们对 :order 子句的使用与您使用的一个重要区别:

@posts = Post.paginate :page => params[:page], :order => 'created_at DESC'

这会在 Post 对象上调用 paginate(尚未选择任何对象 -在 paginate 出现之前没有执行任何 SQL )。这在您的示例中有所不同:正如您在第一行代码中所说的“返回文章数组”。我能想出的最简单的问题是

  results = Model.limit(5).all
  @results = results.paginate :order => :doesnt_matter_anymore

不会排序,但这会:

  results = Model.limit(5)
  @results = results.paginate :order => :matters

去掉搜索方法就足够了all。它使 ActiveRecord 在调用此方法时实际执行 SQL 查询。Will_paginate 会在您调用时为您执行此操作paginate(如果您允许...)。查看这篇文章中关于Active Record Query Interface 3.0的延迟加载部分

于 2011-02-07T21:43:59.930 回答