2011-01-18 9 views
3

私はかなり単純な関数を呼び出しています。何が起きているのか分からないようです。 (私はレール3.0.3と 'will_paginate'宝石のマスターブランチを使用しています)。私は、次のコードを持っている:Will_Paginateとorder節は機能しません。

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]のようなものを使ってチェックすると、要素は常に同じです。私の見解では、彼らは明らかに常に同じものです。私は何かを完全に欠いていますか?

私はその何かばかげていると確信していますが、私は一晩中壁に頭を叩いています。どんな助けでも大歓迎です!検索句は次を行います:追加する

編集

#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 

ありがとう:これらの人のそれぞれが、このようなsearchlogicベースの機能がある

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 

。オーダー句とあなた::

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

は、この呼び出しはありませんオブジェクトと(Postオブジェクトにページ番号を付け、あなたがwill_paginateのgithubのページからの例を見れば

+0

私は小さなテストケースを自分で作成しましたが、すべてがページネートでうまくいきました。おそらくあなたの注文句を無効にする可能性があるあなたのモデルの範囲がありますか?私が気づく唯一の他の事は、あなたが 'title'でソートすることを意味するモデル 'article'のための 'article_title'のあなたの命名でしょうか?そうでなければ、 'created_at desc'と 'created_at'で注文しようとしましたか? – AllDayer

+0

検索コールの詳細を追加するように編集しました。 AllDayer-そこには何かが起こっているかもしれないとは思いますが、何がわからないのでしょうか。私はちょうど通常の検索を実行するとうまく動作します。 orderステートメントで呼び出さないと、記事のスコープはどのように上書きされますか? –

答えて

7

あなたはそれらの使用の間に1つの重要な違いを見つけることができますまだ選択されていません - 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があなたのためにそれを行います(あなたがそれを聞かせたら...)。この記事のLazy Loadingに関するセクションをチェックしてください。Active Record Query Interface 3.0

関連する問題