2

我正在使用counter_cache計算投票數。用戶可以做一個upvote和downvote。使用計數器緩存在rails 4中使用upvote count

我的模型

vote.rb

attr_accessible :celebrity_id, :user_id, :vote_dvote 
belongs_to :user 
belongs_to :celebrity, counter_cache: true 

celebrity.rb

attr_accessible :name, :gender, :category_id, :votes_count 
belongs_to :user 
belongs_to :category 
has_many :votes 

def total_upvotes 
    Vote.where('vote_dvote = ?', true).count 
end 

def percentage_of_votes 
    (self.votes_count.to_f/self.total_upvotes.to_f * 100.0).round(2) 
end  

控制器

def show_ranking    
    @celebrities = Celebrity.includes(:category).order(votes_count: :desc)  
    @celebrities.each do |celeb| 
    celeb["votes_count"] = celeb.percentage_of_votes     
    end 
end 

都給予好評,並downvote保存在投票表格,對給予好評「 vote_dvote = 1'和fo r downvote'vote_dvote = 0',每個名人的votes_count被保存在名人表中。在我的情況下發生的事情是投票數量超過了總投票數。所以我無法得到確切的百分比。

但我只需要upvote count。

回答

0

我在過去曾經遇到過類似的問題,並且花了很多時間找出counter_cache是​​否可以做類似的事情,但什麼都沒發現。我想知道是否有人得到了更清晰的解決方案,但是我在我的項目中做的是使用自定義方法來執行counter_cache應該執行的操作,我稱之爲「indexify!」。因爲某些原因。 就你而言,它看起來像這樣。遷移兩列:upvotes_count和:downvotes_count名人表,然後:

celebrity.rb

# before_save :indexify! # only needed in certain cases 

def indexify! 
    self.downvotes_count = self.votes.where(vote_dvote: true) 
    self.votes_count = self.votes.where(vote_dvote: false) 
end 

vote.rb

after_save :indexify! 

def indexify! 
    self.celebrity.save! 
end 

再一次,或者每遷移或每個控制檯,重置計數器

Celebrity.all.each(&:save!) 

我從來沒有任何問題,該解決方案,但我很stil我想知道Rails提供了什麼通用的東西。

+0

但是upvotes和downvotes沒有插入名人表,我需要做什麼以外的事情 – Saravana

+0

Classic counter_cache還依賴於已經插入到名人表中的votes_count。我只描述了counter_cache實際上可以執行的行爲,如果它可以與upvotes_count或downvotes_count一起使用。 –

+0

我目前正在爲我的項目工作的另一個選項是使用Redis作爲緩存來存儲計算的數據,例如,在您的示例中,名人的upvotes的最後數量將被緩存,直到另一個upvotes被創建,該數字需要重新計算。 –