希望这是一个相对简单的解决方案。我有一个帖子表和一个喜欢表。用户可以喜欢一个帖子,所以帖子有_很多喜欢和喜欢属于_to个帖子。
考虑到这一点,我将如何获得上周最受欢迎的帖子(按赞)?我想将解决方案简化为一个查询,因为将查询限制在上周应该可以避免任何扩展问题(我认为)。
希望这是一个相对简单的解决方案。我有一个帖子表和一个喜欢表。用户可以喜欢一个帖子,所以帖子有_很多喜欢和喜欢属于_to个帖子。
考虑到这一点,我将如何获得上周最受欢迎的帖子(按赞)?我想将解决方案简化为一个查询,因为将查询限制在上周应该可以避免任何扩展问题(我认为)。
首先,您需要一个表示一周前日期时间的变量。我认为它会是这样的:
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 {}
并where("created_at < ?", DateTime.now - 1.week)
在select
. 你甚至可以传入一个参数来控制过滤的距离。更多详细信息请参阅ActiveRecord 指南中有关传递参数的详细信息