如何在Rails控制器中过滤无关联评论的书籍,解决pagy分页首页为空问题
解决方案
核心修改思路
直接在数据库查询层面过滤无评论的书籍,避免无意义的记录被查询出来占用分页额度。你只需要修改控制器中的查询语句即可,修改后也可以直接删掉视图层的空评论判断冗余代码。
修改后的代码实现
方案1:JOIN关联实现(写法简洁,适合大多数场景)
@pagy, @books = pagy_countless( Book.where(user_id: current_user.id) .joins(:comments) # 内连接自动过滤无关联评论的书籍 .includes(:comments) # 预加载评论避免N+1查询 .group("books.id") # 按书籍ID去重,避免一本书有多条评论时返回重复记录 .order("MAX(comments.created_at) DESC"), # 按书籍最新评论的创建时间倒序 items: 10 )
方案2:EXISTS子查询实现(性能更稳定,适合评论数据量大的场景)
@pagy, @books = pagy_countless( Book.where(user_id: current_user.id) .where("EXISTS (SELECT 1 FROM comments WHERE comments.book_id = books.id)") # 仅保留存在关联评论的书籍 .includes(:comments) .order(Arel.sql("(SELECT MAX(comments.created_at) FROM comments WHERE comments.book_id = books.id) DESC")), items: 10 )
关键改动说明
- 新增的过滤逻辑直接在SQL层面执行,查询结果里只会保留有至少1条评论的书籍,不会再出现无评论记录占分页位置的问题
- 调整了分组和排序逻辑,修正了原代码中按
comments.created_at分组导致同一本书出现多条记录的问题 - 修改后可以直接删除视图层的
<% if b.comments.empty? %>冗余判断
内容的提问来源于stack exchange,提问作者superbot
相关产品推荐
相关产品推荐

