これが比較的簡単な解決策であることを願っています。投稿テーブルといいねテーブルがあります。ユーザーは投稿にいいね!
それを念頭に置いて、先週から最も人気のある投稿 (いいね) を取得するにはどうすればよいでしょうか? クエリを先週だけに制限すると、スケーリングの問題を寄せ付けないはずなので、ソリューションをクエリだけに抑えたいと思います(と思います)。
これが比較的簡単な解決策であることを願っています。投稿テーブルといいねテーブルがあります。ユーザーは投稿にいいね!
それを念頭に置いて、先週から最も人気のある投稿 (いいね) を取得するにはどうすればよいでしょうか? クエリを先週だけに制限すると、スケーリングの問題を寄せ付けないはずなので、ソリューションをクエリだけに抑えたいと思います(と思います)。
まず、1 週間前の日時を表す変数が必要です。次のようなものになると思います:
one_week_ago = Time.now - 1.week
上位 n 件の投稿のすべての投稿を比較する前に、投稿ごとに先週のいいねの数を計算し、それを変数に格納する必要があります。
likes_for_last_week = post.likes.where("created_at > ?", one_week_ago).count
これらすべてを配列に格納できます。
[[post,likes_for_last_week][post,likes_for_last_week]...]
次に、<=> 演算子を使用して並べ替えます。
簡潔で申し訳ありませんが、私はかなり初心者のプログラマーであるため、これだけのガイダンスを得るにはかなりの量の調査が必要でした。
名前付きスコープでこれを行うことをお勧めします。
SQL クエリは次のようになります。
SELECT post_id, count(post_id) as count FROM "likes"
GROUP BY post_id ORDER BY count desc LIMIT 3
次のように Like クラスでこれを取得できます。
scope :popular, select("post_id, count(post_id) as count").group(:post_id).order("count desc").limit(3)
次に、最も人気のある投稿が必要な場合は、次のようにします。
@popular = Like.popular
@popular[0].post_id # this will be the id of the Post
@popular[0].count # this will be the count of likes for that Post
これの利点は、常に最も人気のある投稿が表示されることです。好きなものを先週のものに制限したい場合は、上記の select ステートメントを に入れ、の前にalambda {}
を使用します。引数を渡して、フィルタリングするまでの時間を制御することもできます。詳細については、引数の受け渡しに関する ActiveRecord ガイドの詳細を参照してください。where("created_at < ?", DateTime.now - 1.week)
select