You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveAdmin中实现四级has_many关联的分组下拉选择

要实现四级关联的分组下拉,我们可以在Configuracion模型中编写一个自定义方法,手动构建嵌套的选项组结构,然后在ActiveAdmin的表单中使用这个方法生成的集合。下面是具体的实现步骤:

第一步:在Configuracion模型中添加自定义选项生成方法

我们需要从最顶层的IsicSeccion开始,逐层遍历关联的IsicDivision、IsicGrupo,最终到Isicclase,构建出嵌套的数组结构——Rails的select表单助手会自动将这种结构渲染成多层<optgroup>标签。

同时为了避免N+1查询问题,我们会用includes预加载所有关联数据:

class Configuracion < ActiveRecord::Base
  # 你的已有代码...

  def self.isic_clases_nested_options
    nested_options = []
    # 预加载所有关联,避免多次数据库查询
    IsicSeccion.includes(isicDivisiones: { isicGrupos: :isicclases }).all.each do |seccion|
      division_groups = []
      seccion.isicDivisiones.each do |division|
        grupo_groups = []
        division.isicGrupos.each do |grupo|
          # 生成当前分组下的所有Isicclase选项
          clase_options = grupo.isicclases.map { |clase| ["#{clase.codigo} - #{clase.titulo}", clase.id] }
          grupo_groups << [grupo.titulo, clase_options]
        end
        division_groups << [division.titulo, grupo_groups]
      end
      nested_options << [seccion.titulo, division_groups]
    end
    nested_options
  end
end

第二步:在ActiveAdmin表单中使用自定义选项集合

修改ActiveAdmin中Configuracion的注册代码,将isicclases的collection替换为我们刚才定义的方法:

ActiveAdmin.register Configuracion do
  permit_params :comercial, :social, :polcorreo, :personal, :bienvenida, :localizacion, :galleta, :slogan1, :slogan2, :logo, :logo_file_name, :privacidad, :aviso_legal, :locale, :proteccion_de_datos, isicclase_ids: []

  form do |f|
    f.actions
    f.semantic_errors *f.object.errors.keys
    f.inputs "Configuración" do
      tabs do
        tab 'Empresa' do
          f.input :isicclases, 
                  as: :select, 
                  multiple: true, 
                  label: 'Código ISIC', 
                  collection: Configuracion.isic_clases_nested_options, 
                  include_blank: false
          # 你的其他表单字段...
        end
      end
    end
  end
end

效果说明

这样配置后,你的下拉选择框会呈现四级嵌套的分组结构:

  • 最外层是IsicSeccion的名称作为一级分组
  • 每个一级分组下是对应的IsicDivision作为二级分组
  • 二级分组下是对应的IsicGrupo作为三级分组
  • 三级分组下就是最终可选的Isicclase选项

这种方式完全利用了Rails表单助手对嵌套数组的支持,不需要额外的gem,就能实现多级分组的下拉选择。

内容的提问来源于stack exchange,提问作者Miguel Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:30:42