如何为帖子建立投票和投票?

时间:2012-09-23 19:04:17

标签: ruby-on-rails ruby-on-rails-3

我有一个允许用户发布的应用。每个帖子都可以被投票和投票。每个用户的声望都来自他们帖子的upvotes和downvotes。现在,我在两个地方跟踪每个帖子的upvotes和downvotes。首先,有我的帖子表:

 create_table "posts", :force => true do |t|
    t.integer  "user_id"
    t.text     "content"
    t.integer  "upvotes",    :default => 0
    t.integer  "downvotes",  :default => 0
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
  end

我还用单独的'投票'表跟踪每个投票,以便我知道哪个用户已经投票了一个帖子(0投票不投票,1投票是投票,投票2是一个upvote):

create_table "votes", :force => true do |t|
    t.integer  "user_id"
    t.integer  "post_id"
    t.integer  "vote",       :default => 0
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
  end

我最初在两个不同的表格中跟踪投票后的投票,以便更有效地查询特定帖子的投票数量,例如:

post_reputation = post.upvotes - post.downvotes

但是,我现在认为这是不好的做法,我应该删除“帖子”表上的“upvotes”和“downvotes”列,以便不重复投票数据。然后,我会计算帖子声誉做这样的事情:

def calculate_post_reputation(post_id)
  some_post = Post.find(post_id)
  vote_count = 0
  some_post.votes.each do |vote|
    if vote.vote.to_i == 2
      vote_count += 1
    elsif vote.vote.to_i == 1
      vote_count -= 1
    end
   end
  vote_count
end

保留'upvotes'和'downvotes'列或删除它们并使用'votes'表来计算帖子声誉是否更好?

1 个答案:

答案 0 :(得分:0)

我会考虑(伪代码):

Models:

class User < ActiveRecord::Base
  has_many :votes
  has_many :posts, :through => votes

class Post < ActiveRecord::Base
  has_many :votes
  has_many :users, :though => :votes

class Vote < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
  attr_accessor :direction
  UP='Up'
  DOWN='Down'
  DIRECTIONS=[UP,DOWN]
  validates_inclusion_of :direction, in: [DIRECTIONS]
  scope :up_votes where(:direction => UP) 
  scope :down_votes where(:direction => DOWN)

然后使用Post.votes.up_votes.countPost.votes.down_votes.count获得向上或向下投票数。

您概述的方法是我过去常常在SQL中解决它,上面是一种更多的rails风格方法。您需要添加适当的数据库迁移。