ruby-on-rails - 在投票后禁用 acts_as_votable gem 中的投票按钮

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

上下文:

我有一个 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

现在,让我们进入细节:

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

  1. 获取帖子上的所有选票。理想情况下,确保让 MySQL 返回尽可能少的 ActiveRecord 对象。因为,将每个 MySQL 行转换为 Active Record 会造成相当大的性能损失。

  2. 遍历所有 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/

相关文章:

ruby - 将 Net::IMAP 电子邮件写入 mikel/mail 电子邮件

ruby - 用 ruby​​ 计算字符串中的元音

ruby - 将代码语句放在大括号中是好的编程习惯吗?

algorithm - 在数组上构建堆算法。无需暴力破解即可生成结果

ruby-on-rails - 'bundle install' 是否会在我的计算机上永久安装所有必需的 gem?

ruby-on-rails - 如何将 polymer (1.0)与Rails(4)一起使用?

ruby-on-rails - SQL查询和ActiveRecord.find_by_sql返回不同的结果怎么可能?

algorithm - 比赛安排问题

algorithm - 在 2d 图像算法上检测多个相似的石头?

ruby-on-rails - 如何将 Bundler 与离线 .gem 文件一起使用?