2011-03-18 39 views
0

我已经实现了一个上/下投票系统,在我的Ruby on Rails应用程序中使用ajax进行更新。按钮调用create方法,将投票插入到数据库中,并计算投票总和。修复投票机制

但是,截至目前,用户可以根据自己的喜好多次或多次投票。我希望投票能够像我们在StackOverflow上看到的一样,用户只能投上或下投票一次,并且可以撤消投票。我如何构建这个逻辑?

回答

1

我会推荐acts_as_rateable宝石,这是我一直在使用这种多个网站的要求。完美的工作。

如果你想自己实现这个,你的Rating模型应该有一个user_id并且是多态的,以便自己附加到你想要评估的任何模型上。然后你可以简单地编写你的AJAX控制器来拒绝重复投票。在前端,应该使用Javascript来移除现有的upvote/downvote的链接功能,以实现良好的用户体验。

+0

现在它是一个独立的资源,它有一个video_id和一个user_id – 2011-03-18 18:25:26

+0

如果视频是你要评分的唯一东西,那么这是一个好方法。在这种情况下,您可能只需执行'@previous_rating = Rating.where(:video_id => params [:video_id],:user_id => current_user.id).first'并检查'@ previous_rating.nil?'来检查是否该用户之前对该视频进行了评分。如果他有,检查传入的评级,如果不同,则将其更改为upvote/downvote;如果相同,则返回。 – 2011-03-18 18:29:30

+0

这是有道理的。为什么你必须在'where'调用结束时执行'.first'?用户不应该只有一个投票吗? – 2011-03-18 18:35:28

0

我认为你有更多的工作要做。您应该在模型中添加问题与用户之间的多对多关系,您可以在其中记住哪个用户投票选择哪个问题以及以哪种方式投票(向上或向下)。之后,当您在屏幕上呈现问题时,您应该从该表中选择与显示的问题相关的当前用户的投票。

当用户投票提出问题时,您应该为相应的表添加一条记录。此外,显示问题时,如果用户已投票(downvoted),那么您应该按顺序设置upvote(downvote)链接的样式。如果用户再次投票,您可以在用户投票之前在数据库中注册投票之前对其进行检查。

也许这不是做这种事情的最快方法,但它给了你最大的控制权(你可以稍后显示一个关于某个用户的投票风格,投票的日期和时间的详细统计信息铸造,可以加以限制,以选票的用户可以每天投等的数量...)

+0

我已经拥有video_votes作为独立资源的视频和用户之间的多对多关系。感谢您的建议。 – 2011-03-18 18:26:29

+0

然后你应该检查你的ajax方法,如果用户已经投票,然后坚持他的投票数据库 – 2011-03-18 18:33:03

+0

是啊,这就是我要做的。 – 2011-03-18 18:34:33

0
class Vote < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :user 

    validates_uniqueness_of :user_id, :scope=>question_id  
end 

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086

你的控制器,如果你尝试多次投票将返回错误。如果你投下了一票,你的用户界面就会删除投票。

+0

如果用户第二次投票,投票应该被撤消,所以我不认为这是我正在寻找的。 – 2011-03-18 18:34:10

+0

为什么允许第二次投票? – 2011-03-18 18:36:29

+0

更具体地说,如果投票存在,你的UI应该发送一个方法=>:delete。这是SO方式。 – 2011-03-18 18:37:40