我是Rails的新手,所以请轻松一点。我创建了一个博客,并且还为用户创建了表明他们“喜欢”特定帖子的能力。我实现这一点的方法是使用post表和单独的表'vote'。当用户点击“喜欢”按钮时,它会将记录发送到“投票”表,其值为“1”和特定的帖子ID。
我想在侧边栏中显示“最喜欢”的帖子。我怎么去做这样的事情。我想显示post_title和'投票'的数量,也就是说,我想以某种方式查询具有最多记录的post_id的'vote'表,并按降序显示它们。
我希望这是一个简单的问题。
答案 0 :(得分:2)
这实际上最好通过向帖子模型添加计数器缓存来完成,从而避免每次加载时数据库计数。
此railscast episode说明了如何设置计数器缓存。
假设您将计数器缓存命名为votes_count,您可以执行此操作以从控制器中获取10个最受欢迎的帖子。
@popular_posts = Post.find(:all, :limit => 10, :order => "votes_count DESC")
答案 1 :(得分:2)
有几种方法可以实现这一点,但可能是最通用的Rails-ish将创建一个带有方法进行排名的模块,然后让任何可以“喜欢”的类或关联扩展该模块
# lib/likable.rb
#
module Likable
def most_liked (limit = 10)
# This may be possible without a find_by_sql... see the API docs.
find_by_sql("SELECT Posts.*, SUM(votes.count) AS num_votes FROM Posts, Votes WHERE Posts.id = post_id GROUP BY post_id ORDER BY num_votes DESC LIMIT #{limit}")
end
end
# app/models/post.rb
#
require 'likable'
class Post < ActiveRecord::Base
extend Likable
# ...whatever else you've got in here
end
# app/models/user.rb (or any other model with things that can be "liked")
#
require 'likable'
class User < ActiveRecord::Base
has_many :posts, :extend => Likable
# ...the rest of the User class
end
这可以让你做像...这样的事情。
Post.most_liked # => an array of the 10 most liked posts
@some_user.posts.most_liked(5) # => that user's 5 most liked posts
如果您以后需要,可以向模块添加方法,以查看特定帖子有多少票。您还可以将post_id
更改为target_id
中的Vote
并使其成为多态关联,然后您可以使用您的Likable模块投票支持任何内容,而不仅仅是帖子(您需要)如果你这样做,可以将调用一般化为most_liked。