使用acts_as_votable计算用户业力

时间:2014-02-27 23:55:59

标签: ruby-on-rails ruby ruby-on-rails-4

我使用acts_as_votable gem:https://github.com/ryanto/acts_as_votable

有三种可投票的模型

  1. 评论
  2. 图书
  3. 这些模型中的每一个都属于用户。

    用户业力将是他们在所有评论,书籍和电影上收到的总票数,乘以2加上得分调整值。

    现在我正在尝试这个评论:

    <%= "#{((current_user.comments.map{|c| c.votes.count}.inject(:+))*2) + current_user.score_prop}" %>
    

    我收到了这个错误:

    undefined method `*' for nil:NilClass
    

    我在发生错误后继续遇到错误。根据评论,书籍和电影计算总分的最佳方法是什么?我应该从我的控制器而不是我的视图中执行此操作吗? (我在视图中有它的原因是因为我在页脚布局中有这个。

1 个答案:

答案 0 :(得分:2)

<%= "#{((current_user.comments.map{|c| c.votes.count}.inject(:+))*2) + current_user.score_prop}" %>

首先,<%=已经调用to_s - 您不需要将计算放在字符串中:"#{}"

<%= ((current_user.comments.map{|c| c.votes.count}.inject(:+))*2) + current_user.score_prop %>

其次,sum存在并且比inject更容易理解,因此最好在可能的地方使用它:

<%= ((current_user.comments.map{|c| c.votes.count}.sum)*2) + current_user.score_prop %>

最后,让我们去除部分。这让我们看到你的长计算的哪个部分是破坏的 试试这个,看看现在是否有任何一行断开:

<% comment_vote_count = current_user.comments.map{|c| c.votes.count}.sum
   # I've added this as my best guess for what will fix your problem
   comment_vote_count ||=0 

   comment_vote_count *= 2
   total_vote_count = comment_vote_count + current_user.score_prop %>
<%= total_vote_count %>

现在,一旦你完成所有工作 - 你可以将代码重新放回一行 - 当出现问题并且无法弄清楚哪个位出现故障时,将这些东西拆分出来是件好事。