在单独的表中按“投票”记录的数量显示帖子

时间:2009-11-20 16:25:37

标签: ruby-on-rails ruby blogs

我是Rails的新手,所以请轻松一点。我创建了一个博客,并且还为用户创建了表明他们“喜欢”特定帖子的能力。我实现这一点的方法是使用post表和单独的表'vote'。当用户点击“喜欢”按钮时,它会将记录发送到“投票”表,其值为“1”和特定的帖子ID。

我想在侧边栏中显示“最喜欢”的帖子。我怎么去做这样的事情。我想显示post_title和'投票'的数量,也就是说,我想以某种方式查询具有最多记录的post_id的'vote'表,并按降序显示它们。

我希望这是一个简单的问题。

2 个答案:

答案 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。