1

いくつかの has_many 関連付けを持つ Post モデルがあります。

class Post < ActiveRecord::Base
 ...
 has_many :votes
 has_many :comments
 has_many :ratings
end

( ) で投稿を並べ替えるクエリが必要ですvotes.count + comments.count + ratings.count

たとえば、ある投稿に 3 票、2 コメント、1 評価があった場合、その順序付けの「メトリック」の値は 6 になります。これを行うにはどうすればよいですか?

同じ 3 つのパラメーター (投票、コメント、評価) で注文する 2 番目のクエリも必要ですが、に反比例する 4 番目のパラメーターも追加するcreated_atため、新しい投稿は高くランク付けされ、古い投稿は低くランク付けされます。要約すると、順序メトリックは次のようになります。

( F*(1/created_at) + votes.count + comments.count + ratings.count)、ここで F は倍率です。どうすればいいですか?

4

3 に答える 3

1

これをデータベースで行う必要がある理由はありますか? そうでない場合は、すべてのレコードとそれに含まれる関連付けを見つけた後、sort_by ruby​​ メソッドを使用することをお勧めします。何かのようなもの:

# In the post model 
class Post < ActiveRecord::Base
  def custom_metric
    votes.size + comments.size + ratings.size
  end
end

# In post controller
@posts = Post.where(id: ..).includes(:votes, :comments, :ratings).sort_by(&:custom_metric)

オブジェクトを並べ替える他の方法についても、同じタイプのロジックに従うことができます。この方法は、提案されている他の方法に比べて比較的高速であり、データの非正規化を引き起こさないという利点があります。データベースの状態に関係なく、クエリは常に目的の結果を返します。

于 2013-04-16T05:02:19.717 に答える