2015-01-07 114 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。

相關問題