我有一个允许用户发布的应用。每个帖子都可以被投票和投票。每个用户的声望都来自他们帖子的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'表来计算帖子声誉是否更好?
答案 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.count
和Post.votes.down_votes.count
获得向上或向下投票数。
您概述的方法是我过去常常在SQL中解决它,上面是一种更多的rails风格方法。您需要添加适当的数据库迁移。