簡體   English   中英

Will_Paginate和order子句不起作用

[英]Will_Paginate and order clause not working

我稱之為一個非常簡單的功能,似乎無法弄清楚最新情況。 (我使用rails 3.0.3和'will_paginate'gem的主分支)。 我有以下代碼:

  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

其中每個人都是基於searchlogic的函數,如下所示:

#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

謝謝。

如果你看一下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查詢。 當您調用paginate時,Will_paginate會為您執行此操作(如果您允許它...)。 在這篇文章中查看有關Active Record Query Interface 3.0的延遲加載部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM