gpt4 book ai didi

ruby-on-rails - 防止为每个评论调用 upvote 模型

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:08 24 4
gpt4 key购买 nike

我有三个模型:User、Comment 和 Upvote。 User-to-Comment 是一对多的关系,Comment-to-Upvote 是一对多的关系,而 User-to-Upvote 是一对多的关系。

我想做一些类似于在 Stackoverflow 上进行投票的事情。因此,当您投赞成票/反对票时,箭头将突出显示并保持突出显示状态,即使您在几天/几周后刷新页面或返回页面也是如此。

目前我正在这样做:

<% if Upvote.voted?(@user.id, comment.id) %>
<%= link_to '^', ... style: 'color: orange;'%>
<% else %>
<%= link_to '^', ... style: 'color:black;'%>
<% end %>

voted? 方法在哪里:

  def self.voted?(user_id, comment_id)
find_by(comment_id: comment_id, user_id: user_id).present?
end

因此,如果我在一个页面上有 10 条评论,这将从我的数据库中加载 10 次赞成票,只是为了检查它是否存在!

必须有更好的方法来执行此操作,但我想我的大脑停止工作了,所以我想不出任何方法。

最佳答案

假设你已经正确设置关系

# user.rb
class User
has_many :upvotes
end

我们可以加载评论、当前用户和他的赞:

# comments_controller.rb
def index
@comments = Comment.limit(10)
@user = current_user
user_upvotes_for_comments = current_user.upvotes.where(comment_id: @comments.map(&:id))
@upvoted_comments_ids = user_upvotes_for_comments.pluck(:comment_id)
end

然后在 View 中更改if条件:

# index.html.erb
<% if @upvoted_comments_ids.include?(comment.id) %>
<%= link_to '^', ... style: 'color: orange;'%>
<% else %>
<%= link_to '^', ... style: 'color:black;'%>
<% end %>

它只需要 2 个数据库查询。希望对您有所帮助。

关于ruby-on-rails - 防止为每个评论调用 upvote 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30868352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com