Ruby on Rails 如何按条件筛选数组前N个元素(取前3条匹配评论示例)
解决方案
核心修改逻辑:先针对每个post筛选出所有匹配的评论,再取前3条渲染,同时直接用筛选后的评论数组长度作为总评论数,比原有手动计数的方式更简洁高效,同时修正了原有代码中<tr>标签位置错误的问题(原代码</tr>放在@posts循环外,会导致所有post数据渲染到同一行)。
注:原代码中用的
===也可以替换为Ruby更常用的==做相等判断,当前场景下效果一致。
修改后的完整代码如下:
<tbody> <% @posts.each do |post| %> <tr> <% # 匹配发布帖子的用户信息 %> <% @users.each do |user| %> <% if post["userId"] == user["id"] %> <td><%= user["name"] %></td> <% end %> <% end %> <td><%= post["title"] %></td> <td><%= post["body"] %></td> <% # 筛选当前帖子对应的所有评论 %> <% post_comments = @comments.select { |comment| comment["postId"] == post["id"] } %> <% # 只渲染前3条评论 %> <% post_comments.take(3).each do |comment| %> <td><%= comment["body"] %></td> <% end %> <% # 输出当前帖子的总评论数 %> <td><%= post_comments.size %></td> </tr> <% end %> </tbody>
如果你不想修改原有遍历逻辑,也可以在原有循环里增加计数判断,当已展示评论数达到3条后停止渲染评论内容即可(该方案遍历效率低于提前筛选的方案,不推荐):
<% comments_total = 0 %> <% @comments.each do |comment| %> <% if post["id"] == comment["postId"] %> <% # 只渲染前3条评论 %> <% if comments_total < 3 %> <td><%= comment["body"] %></td> <% end %> <% comments_total += 1 %> <% end %> <% end %> <td><%= comments_total %></td>
内容的提问来源于stack exchange,提问作者Javier Arancibia Reyes
相关产品推荐
相关产品推荐

