在投票后禁用acts_as_votable gem中的upvote按钮

时间:2014-12-09 15:01:44

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

上下文:

我有一个forum_as_votable的论坛帖子模型。 向上投票功能正常 向上投票按钮允许current_user仅向论坛线程投票一次,这是所需的功能。我试图在current_user单击它时将向上投票按钮的css更改为其他颜色。

<%= link_to forum_thread do %>
  <h3>
    <%= link_to like_forum_thread_path(forum_thread), method: :put, class: "" do %>
        <span class="glyphicon glyphicon-arrow-up"></span> 
    <% end %>
    <%= forum_thread.get_upvotes.size %>    
    <%= forum_thread.subject %> 
  </h3>
<% end %>

问题:

执行此操作的一种方法是获取所有user_id的列表(使用@ forum_thread.votes_for_ids),他们已经投票支持论坛帖子并检查current_user用户ID是否与列表匹配。如果是,则禁用该按钮。有没有更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

首先解决方案:

  

@ user.voted_for? @post

它也可以在文档中找到。 Here

现在,让我们转到详细信息:

您当前的解决方案执行以下操作:

  1. 获取帖子上的所有投票。理想情况下,请确保让MySQL返回尽可能少的ActiveRecord对象。因为,将每个MySQL行转换为活动记录会导致相当大的性能损失。

  2. 循环遍历所有ActiveRecords并收集其中的USER_ID。循环是另一个性能障碍,如果你可以轻易避免它。

  3. 相反,更喜欢MySQL查询返回我们需要的ROW /数据,“如果当前用户已经投票”。类似(你需要使用正确/ apt数据库表名)

      

    PostVote.find_by_post_id_and_user_id(post_id,user_id)。

    如果用户已投票,则返回上述内容。

    或者,Acts_As_Votable确实提供了相同的功能,而无需您进行繁重的工作:

      

    @ user.voted_for? @post