在Rails中计算两列的最佳方法

时间:2017-06-22 17:39:31

标签: ruby-on-rails

我在rails中创建了一个基本的upvoting和downvoting系统。我有一个跟踪upvotes的列和一个跟踪downvotes的列。有没有办法可以减去这些列(可能是通过助手)来显示两者之间的投票数?

我试了一个帮手:

module PostsHelper
  def count_votes(up, down)
    @total = (up-down)
    return @total
  end
end

Index.html.erb

<% @posts.each do |post| %>
<div class="panel">
  <div class="panel-left">

    <%= link_to 'Upvote',  upvote_post_path(post), method: :patch, remote: true %>

   <%= link_to 'Downvote', downvote_post_path(post), method: :patch, remote: true %>

     <%= count_votes(post.up_vote, post.down_vote) %>

  <%= post.title %>
  <%= post.content %>
</div>
</div>

<% end %>

但是这会产生这个错误:

undefined method `-' for nil:NilClass

有理想的方法吗?我应该在模型中使用某些东西吗?

2 个答案:

答案 0 :(得分:1)

您可以在模型中创建实例方法。类似的东西:

# models/post.rb

  def count_votes
    (up || 0) - (down || 0) # "|| 0" because subtracting from `nil` will throw `nil:NilClass` error.
  end

现在,您可以从视图中调用post.count_votes以获得所需的结果。

答案 1 :(得分:1)

看起来像post.up_vote(以及post.down_vote)列的默认值是NULL。因此up_vote失败了。

您可以将down_vote0的默认值设为default

来解决此问题。

您可以在数据库级别添加此项,方法是在迁移中指定# post.rb after_initialize :set_defaults def set_defaults self.up_vote = 0 self.down_vote = 0 end 或者,如果您不想触摸迁移,可以将其保持在模型级别, 例如:

{{1}}