希望这是一个相对简单的解决方案。我有一个帖子表和一个点赞表。用户可以喜欢一个帖子,所以帖子has_many like和like belong_to帖子。
考虑到这一点,我该如何从上周获得最受欢迎的帖子(通过点赞)?我希望将解决方案简化为一个查询,因为将查询限制在最近一周应该可以避免任何伸缩问题(我认为)。
发布于 2012-08-11 05:54:02
我建议使用命名作用域来执行此操作。
您的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语句放入lambda {}中,并在select之前使用where("created_at < ?", DateTime.now - 1.week)。您甚至可以传入一个参数来控制多长时间的过滤。更多详细信息请参阅ActiveRecord guide details on passing arguments
发布于 2012-08-11 04:12:31
首先,您需要一个变量来表示一周前的日期时间。我认为应该是这样的:
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]...]然后使用<=>运算符进行排序。
请原谅我的简短,但由于我是一个相当新手的程序员,这么多的指导需要我进行大量的研究。
https://stackoverflow.com/questions/11908350
复制相似问题