Rails根据另外两个字段更新数据库字段

时间:2015-01-07 16:21:39

标签: ruby-on-rails database sql-update vote

所以我的文章表中有2个字段。

- :vote_up
- :vote_down

我的应用程序中有更新:vote_up和:vote_down字段的方法可以正常工作。我想做的是按总票数订购我的文章(:vote_up minus:vote_down)。

这样做的最佳方法是什么。我可以使用某种方法直接在控制器中执行此操作吗?或者我必须创建一个:vote_total字段,该字段根据其他两个字段的值自动更新(如果是这样,你如何做)。

非常感谢!

2 个答案:

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