2011-06-21 21 views
3

ruby​​ on lineの新機能で、Rails 3のパフォーマンスとベストプラクティスに関して(おそらく単純な)質問があります。私はエンキのブログと呼ばれるブログのエンジンを使用しています、と私は、このブログのエンジンを書いた人は以下の技術を使用してタグを選択していることを参照してください。Ruby on Railsモデルの操作

Tag.find(:all).reject {|tag| tag.taggings.empty? }.sort_by {|tag| tag.taggings_count }.reverse 

空のタグがあるので、私は「.reject」の目的は何を見ていません記事が作成、更新、または破棄されるたびに削除されます。私はそれについて正しいと思う、これはより良いアプローチですか?

Tag.find(:all, :order => "taggings_count desc") 

私はパフォーマンスと可読性を求めています。モデルの結果をドリルダウンする最良の方法は何ですか? ".sort_by"とpassing:orderの間に実際の違いはありますか?

ご回答ありがとうございます。

+1

次のようになりますRailsの3で

Tag.find(:all, :conditions => "taggings_count > 0", :order => "taggings_count desc") 

を使用していたでしょうか?私が正しいことを覚えていれば、追加のパラメータ( ':order'など)で' find'を使用することは推奨されません。私は 'Tag.order(" taggings_count desc ")'を推奨します:) – PeterWong

+0

はい、私はレール3を使用しています。Tag.order( "taggings_count desc")はTag.find(:all、 order => "taggings_count desc")?暗黙のうちにすべてを選択しますか?その場合、.orderはパラメータ化されたバージョンと同じレベルのパフォーマンスを持ちますか? –

+2

Rails 3.1で廃止予定です。新しいプロジェクトで旧式の構文を使用する理由はありません。私はあなたが好奇心があるならばあなたが[railscast](http://railscasts.com/episodes/202-active-record-queries-in-rails-3)を見て、違いを知ることをお勧めします。 –

答えて

2

これは間違いなく非効率的なコードです。

sort_byと:orderの間には大きな違いがあります。 :orderはSQL文を作成するために使用されます。つまり、データベースはレコードを返す前にレコードをソートします。 sort_byは、データベースがすでに返したレコードを並べ替えるRubyメソッドです。一般的に、データベースははるかに高速になるので、ユーザーは注文します。

拒否が必要かどうかについては言えません。しかし、の場合は、WHERE文を使用してデータベース内で実行する方がはるかに高速です。だから、あなたはrails3を

Tag.where('taggings_count > 0').order('taggings_count desc') 
+0

私はあなたの答えに感謝します。しかし、私はRails 3を使用していることを忘れていました:私の上のコメント作成者がパラメータを非推奨としていますか?レール3を使用していることを私の投稿に編集します。 –

+1

古い構文条件: '{c​​onditions} => {}' hash –

+0

ああ、私は間違いなく、Rails 2と3スタイルの奇妙な合成を作成しました。 'taggings_count desc') – bioneuralnet

関連する問題