Ruby On Rails:无分类表时基于packs表category_id分组展示Pack
嘿,我来帮你搞定这个分类展示的问题!首先你当前的控制器代码里有个小误区,咱们一步步调整:
修正PacksController的索引方法
你写的includes(:category_id)是多余的——category_id是packs表自己的字段,不是关联的模型,所以不需要用includes来预加载。咱们简化一下代码:
def index @title = 'Packs' # 建议把标题也改成和命名统一的Packs哦 # 直接对所有Pack按category_id分组 @packs_by_category = Pack.all.group_by { |pack| pack.category_id } end
要是有些Pack的category_id是空值,你可以加个过滤避免出现空分类:
@packs_by_category = Pack.where.not(category_id: nil).group_by { |pack| pack.category_id }
在视图里渲染分类后的Pack列表
接下来到app/views/packs/index.html.erb(假设用ERB模板),咱们遍历每个分类,把对应的Pack列出来:
<h1><%= @title %></h1> <% @packs_by_category.each do |category_id, packs| %> <h2><%= category_id %></h2> <!-- 直接把category_id字符串作为分类标题展示 --> <ul> <% packs.each do |pack| %> <li><%= pack.name %></li> <!-- 替换成你实际要展示的Pack属性,比如名称、描述等 --> <% end %> </ul> <% end %>
额外的优化小建议
- 如果
category_id是类似"electronics"这种短编码,你可以在Pack模型里加个方法转成友好的显示名称:
# app/models/pack.rb def category_display_name case category_id when "electronics" then "Electronics" when "clothing" then "Clothing" # 这里可以继续添加其他分类的映射 else category_id.titleize # 默认把字符串转成首字母大写的格式 end end
之后不管是在控制器分组还是视图展示,都可以用这个方法:
# 控制器里按友好名称分组 @packs_by_category = Pack.all.group_by { |pack| pack.category_display_name }
- 如果想让分类按名称排序,只要对分组后的结果做个排序就行:
@packs_by_category = Pack.all.group_by { |pack| pack.category_id }.sort.to_h
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

