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
相关产品推荐
相关产品推荐

