上下文:
我有一个 acts_as_votable 论坛线程模型。 赞成票功能运行良好 up vote 按钮允许 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
它也可以在文档中找到。 Here
现在,让我们进入细节:
您当前的解决方案执行以下操作:
获取帖子上的所有选票。理想情况下,确保让 MySQL 返回尽可能少的 ActiveRecord 对象。因为,将每个 MySQL 行转换为 Active Record 会造成相当大的性能损失。
遍历所有 ActiveRecords 并在其中收集 USER_ID。循环是另一个性能障碍,如果您可以轻松避免的话。
相反,更喜欢 MySQL 查询,它返回我们真正需要的 ROW/Data,“如果当前用户对帖子进行了投票”。类似(您需要使用正确/适当的数据库表名):
PostVote.find_by_post_id_and_user_id(post_id, user_id).
如果用户投票或未投票,上面的返回。
或者,Acts_As_Votable 确实提供了相同的功能,而您无需执行繁重的工作:
@user.voted_for? @post
关于ruby-on-rails - 在投票后禁用 acts_as_votable gem 中的投票按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382037/