所以我的文章表中有2个字段。
- :vote_up
- :vote_down
我的应用程序中有更新:vote_up和:vote_down字段的方法可以正常工作。我想做的是按总票数订购我的文章(:vote_up minus:vote_down)。
这样做的最佳方法是什么。我可以使用某种方法直接在控制器中执行此操作吗?或者我必须创建一个:vote_total字段,该字段根据其他两个字段的值自动更新(如果是这样,你如何做)。
非常感谢!
答案 0 :(得分:1)
请勿在您的控制器中执行此操作。这应该在您的模型中完成。控制器应该只使用该模型。
您可以通过两种方式执行此操作:
解决方案1
在您的控制台中尝试此操作(rails c)
Article
.unscoped
.select(%q(articles.*, (articles.vote_up - articles.vote_down) AS vote_total))
.order(%q(vote_total DESC))
并将其作为Article
类
scope :order_by_total_votes, -> {
select(%q(articles.*, (articles.vote_up - articles.vote_down) AS vote_total))
.order(%q(vote_total DESC))
}
解决方案2
为vote_total
创建一个字段Article
,并在每次更新其中一个投票字段时更新它(使用before_save
回调)。然后你可以像在解决方案1中那样做,但没有select
部分。
<强>建议强>
我会选择解决方案2,因为在其他方面它的查询速度更快
希望这有帮助。
答案 1 :(得分:0)
感谢@Hiasinho指导你。我最后只是创建了一个:vote_total到我的文章数据库,并在我的upvote和downvote方法上更新了它,如此
@article.update_attributes(vote_total: @article.vote_total + 1)
显然,对于downvotes来说它是-1。