2011-01-28 1 views
1

レール2.3.8では、最初に投稿とコメントと投票数の多いクエリを注文しようとしています。2列の合計に対するクエリの並べ替え

私はとPostモデルに新しいメソッドを追加しようとしました:

def interestingness 
    self.comments_count + self.votes_count 
end 

post_of_the_moment = find(:all, :conditions => ["submitted_at BETWEEN ? and ?", from, to], 
          :order  => :interestingness, 
          :limit  => 10 
          ) 

が、このコードは私の不明な列のエラーが発生します。

は、私はまた私にエラーを与えるものではありません。この

post_of_the_moment = find(:all, :conditions => ["submitted_at BETWEEN ? and ?", from, to], 
          :order  => "SUM(comments_count+votes_count) DESC", 
          :limit  => 10 
          ) 

これを試してみましたが、結果として0コメントと0票を持っているだけで1行を置きます。

私は間違っていますか? SUM()は、結果セットをグループ化したために:

おかげで、 アウグスト

答えて

2

これを試してください:あなたが実際に必要なフィールドだけで*上記交換され、それを最適化することができれば

post_of_the_moment = find(:all, :select => '*, comments_count + votes_count AS total', :conditions => ["submitted_at BETWEEN ? and ?", from, to], :order => "total DESC", :limit => 10) 

私も参照してくださいね。また、あなたのMySQLのインデックスを確認しても大丈夫です。カウントを合計するために全テーブルスキャンなどを避けたいのですが。

+0

最初の試行がうまくいかない理由は、「興味深い」がデータベースクエリの後にのみ計算されるためです。データベース自体はモデルを認識しません。テーブルで定義した列のみを認識します。 –

0

は私がやっていたエラーを考え出しました。

これは動作します:私は、ソートフィールドとして、私が作成した興味深メソッドを使用できない理由

post_of_the_moment = find(:all, :conditions => ["submitted_at BETWEEN ? and ?", from, to], 
         :order  => "(comments_count+votes_count) DESC", 
         :limit  => 10 
         ) 

はまだ知りません。

+1

興味深いのはRubyのメソッドですが、findはデータベースに問い合わせます。データベースはRubyの世界で何も知らない。 – Zr40