2015-01-07 113 views
0

所以我在我的Articles表中有2个字段。Rails根据其他两个字段更新数据库字段

- :vote_up 
- :vote_down 

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

这样做的最好方法是什么?我可以直接在控制器中用某种方法做到这一点吗?或者我必须创建一个:vote_total字段,根据其他两个字段的值自动更新(如果是这样的话)。

非常感谢!

回答

1

不要在您的控制器中执行此操作。这意味着要在你的模型中完成。控制器应该只使用模型。

您可以通过两种方式做到这一点:

解决方案1 ​​

在控制台试试这个(护栏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_totalArticle每表决场被更新(使用before_save回调)的一次更新。然后,您可以执行与解决方案1中相同的操作,但不包含select部分。

建议

我会去与解决方案2,因为在其他之中它是在查询速度更快

希望这有助于。

+0

嘿,为此想。我最终做了解决方案2,但略有不同。已在下面发布我的工作答案 – MikeHolford

0

感谢@Hiasinho为你的方向。我结束了刚刚创建:vote_total我的文章的数据库,并更新其对我的两个给予好评和downvote方法,像这样

@article.update_attributes(vote_total: @article.vote_total + 1) 

显然,这是为downvotes -1。

相关问题