所以我在我的Articles表中有2个字段。Rails根据其他两个字段更新数据库字段
- :vote_up
- :vote_down
我在我的应用程序更新:vote_up和:vote_down字段,工作正常的方法。我想要做的是以总票数(:vote_up minus:vote_down)来订购我的文章。
这样做的最好方法是什么?我可以直接在控制器中用某种方法做到这一点吗?或者我必须创建一个:vote_total字段,根据其他两个字段的值自动更新(如果是这样的话)。
非常感谢!
所以我在我的Articles表中有2个字段。Rails根据其他两个字段更新数据库字段
- :vote_up
- :vote_down
我在我的应用程序更新:vote_up和:vote_down字段,工作正常的方法。我想要做的是以总票数(:vote_up minus:vote_down)来订购我的文章。
这样做的最好方法是什么?我可以直接在控制器中用某种方法做到这一点吗?或者我必须创建一个:vote_total字段,根据其他两个字段的值自动更新(如果是这样的话)。
非常感谢!
不要在您的控制器中执行此操作。这意味着要在你的模型中完成。控制器应该只使用模型。
您可以通过两种方式做到这一点:
解决方案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_total
您Article
每表决场被更新(使用before_save
回调)的一次更新。然后,您可以执行与解决方案1中相同的操作,但不包含select
部分。
建议
我会去与解决方案2,因为在其他之中它是在查询速度更快
希望这有助于。
感谢@Hiasinho为你的方向。我结束了刚刚创建:vote_total我的文章的数据库,并更新其对我的两个给予好评和downvote方法,像这样
@article.update_attributes(vote_total: @article.vote_total + 1)
显然,这是为downvotes -1。
嘿,为此想。我最终做了解决方案2,但略有不同。已在下面发布我的工作答案 – MikeHolford