上下文:
我有一个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是否与列表匹配。如果是,则禁用该按钮。有没有更有效的方法来做到这一点?
答案 0 :(得分:1)
首先解决方案:
@ user.voted_for? @post
它也可以在文档中找到。 Here
现在,让我们转到详细信息:
您当前的解决方案执行以下操作:
获取帖子上的所有投票。理想情况下,请确保让MySQL返回尽可能少的ActiveRecord对象。因为,将每个MySQL行转换为活动记录会导致相当大的性能损失。
循环遍历所有ActiveRecords并收集其中的USER_ID。循环是另一个性能障碍,如果你可以轻易避免它。
相反,更喜欢MySQL查询返回我们需要的ROW /数据,“如果当前用户已经投票”。类似(你需要使用正确/ apt数据库表名):
PostVote.find_by_post_id_and_user_id(post_id,user_id)。
如果用户已投票,则返回上述内容。
或者,Acts_As_Votable确实提供了相同的功能,而无需您进行繁重的工作:
@ user.voted_for? @post