上下文:
我有一个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
它在文档中也可用。这里
现在,让我们来看看细节:
您当前的解决方案执行以下操作:
-
获取帖子上的所有选票。 理想情况下,确保MySQL返回尽可能少的ActiveRecord对象。因为,将每个 MySQL 行转换为活动记录会有很大的性能损失。
-
循环遍历所有活动记录并收集其中的USER_ID。循环是另一个性能障碍,如果你可以很容易地避免它的话。
相反,更喜欢MySQL查询,它返回我们确切需要的ROW/Data,"如果当前用户对帖子进行了投票"。 类似的东西(您需要使用正确/适当的数据库表名称(:
PostVote.find_by_post_id_and_user_id(post_id,user_id(。
如果用户是否投票,上述内容将返回。
或者,Acts_As_Votable确实提供了相同的功能,而无需您进行繁重的工作:
@user.voted_for? @post