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



上下文:

我有一个acts_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 是否与列表匹配。如果是这样,请禁用该按钮。有没有更有效的方法可以做到这一点?

首先解决:

@user.voted_for? @post

它在文档中也可用。这里

现在,让我们来看看细节:

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

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

  2. 循环遍历所有活动记录并收集其中的USER_ID。循环是另一个性能障碍,如果你可以很容易地避免它的话。

相反,更喜欢MySQL查询,它返回我们确切需要的ROW/Data,"如果当前用户对帖子进行了投票"。 类似的东西(您需要使用正确/适当的数据库表名称(

PostVote.find_by_post_id_and_user_id(post_id,user_id(。

如果用户是否投票,上述内容将返回。

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

@user.voted_for? @post

最新更新