如何在Active Admin中针对多关联关系仅显示未勾选项?
解决方案:在Active Admin中仅显示未勾选的复选框选项
其实这个需求实现起来很简单,完全不用复杂查询,咱们直接在Active Admin的表单定义里对选项集合做个过滤就行。
假设你的主模型(比如Post)和关联模型(比如Tag)是多对多关联(不管是has_and_belongs_to_many还是has_many :through),你可以这样修改你的Active Admin资源文件:
# app/admin/post.rb ActiveAdmin.register Post do form do |f| f.inputs "Post Details" do # 其他输入字段... f.input :tags, as: :check_boxes, # 核心逻辑:编辑时排除已勾选的项,新建时显示所有未勾选的(也就是全部) collection: f.object.persisted? ? Tag.where.not(id: f.object.tag_ids) : Tag.all end f.actions end end
逻辑说明:
- 当处于新建页面时,
f.object.persisted?会返回false,这时候集合就是所有关联模型数据(因为还没有任何勾选项,所有都是未勾选的) - 当处于编辑页面时,
f.object.persisted?返回true,我们用where.not(id: f.object.tag_ids)排除掉已经和当前对象关联的记录,剩下的就是未勾选的项
这个方式完全符合你说的“无需复杂查询”的要求,只是简单的基于已关联ID做排除,性能也很好,而且关联模型的其他功能不会受影响。如果你的关联字段名称不一样,只需要把:tags和对应的tag_ids换成你自己模型的字段名就行。
内容的提问来源于stack exchange,提问作者Sudeep Ghimiray
相关产品推荐
相关产品推荐

