如何在ActiveAdmin中筛选布尔列?

13

这个问题与 ActiveAdmin 宝石相关。我试图过滤一个布尔类型的列,但是没有成功: filter :column_namefilter :column_name, :as => :boolean 都不起作用。

有什么想法吗?

谢谢!

3个回答

21

filter :column_name, :as => :select会创建一个下拉菜单,其中的选项是“任意(Any)”,“真(True)”和“假(False)”。


1
如果记录集中的所有值都相同,则需要添加__collection__选项或其中一个(True/False)值可能不存在。这样可以使用以下方式: :as => :select, collection: [['True', true], ['False', false]] - MegaTux

12
截至ActiveAdmin 0.6.2版本,使用filter :column_name, as: :select现在有可怕的副作用,会进行完整的表扫描。此外,它的选项现在是“Any”、“true”、“false”。
例如,如果我有一个布尔列enabledDistrict模型,则filter :enabled, as: :select生成查询SELECT DISTINCT "districts"."enabled" FROM "districts" ORDER BY enabled asc来获取3个值。我的地区表很大,所以这显然不是我想要的。
另一方面,虽然我现在可以使用filter :column_name, as: :boolean,但它使用默认为未选中的复选框,这也不是我想要的。
为了恢复0.6.2之前的行为,我必须这样做:filter :enabled, as: :select, collection: [["Yes", true], ["No", false]]。ActiveAdmin为我放置了“Any”值。

使用:select和全表扫描的另一个副作用是,如果没有字段具有例如“false”值,则选择不包含“false”选项! - MegaTux

2

同样地,如果你需要使用复选框,请这样做:

filter :column_name, as: :check_boxes

这将创建名为的复选框,它们的值分别为truefalse

如果你想自定义名称,甚至可能包括标签?然后执行:

filter :column_name, label: "Custom Column Name", as: :check_boxes, collection: [["Paid", true], ["Not paid", false]]

虽然你可以使用复选框(它有效!),但我建议使用as::select,因为它在页面刷新后“记住”所选择的值(在UI上)。截至activeadmin版本1.2.1,复选框尚未具备此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接