尝试在Active Admin上过滤资源时遇到问题。
当我将它们应用于标准内容时,过滤器实际上可以正常工作,但这里是多选。
确实在我的优惠模式中:有一个“Deal_goal”属性,我可以选择很多Deal_goal,例如“获取新用户”或“生成动态更新”
以下是我在我的有效管理表单中输入的方式:
f.input :deal_goal,
:label => "Deal goals",
:as => :select,
:multiple => true,
:collection => DEAL_GOALS
要进行多重选择,我会在我的交易模型
上对其进行序列化应用程序/模型/ deal.rb
class Deal < ActiveRecord::Base
serialize :deal_goal, Array
我也在使用staal.io advice for multi-selects('选择'宝石)
我没有做的是在我的索引页面(交易列表)上,对我的Deal_goal属性进行过滤,如果可能的话,在这里有一个多选项,使我可以根据多种类型的目标(例如:过滤器处理目标#1或目标#3)
我在admin / deal.rb上尝试了以下两种方法,但都没有工作!
filter :deal_goal, :as => :select, :collection => DEAL_GOALS
filter :deal_goal, :as => :multiple_select, :collection => DEAL_GOALS
有人有线索吗?
答案 0 :(得分:7)
您可以使用与multiple: true
相同的方式创建多项选择:
filter :deal_goal, as: :select, collection: DEAL_GOALS, multiple: true
从Active Admin / Ransack查询PostgreSQL数组可以完成,只需要多做一些工作。首先,您应该将postgres_ext gem添加到Gemfile中。它为您提供了一组很好的查询方法,您可以像这样使用它们:
User.where.contains roles: ['foo']
# or:
User.where User.arel_table[:roles].contains ['foo']
下一步是告诉Ransack这些查询方法(或“谓词”)存在。把它放在初始化器中:
# https://github.com/activerecord-hackery/ransack/issues/321
Ransack.configure do |config|
{ array_contained_within: :contained_within,
array_contained_within_or_equals: :contained_within_or_equals,
array_contains: :contains,
array_contains_or_equals: :contains_or_equals,
array_overlap: :overlap
}.each do |rp, ap|
config.add_predicate rp, arel_predicate: ap, wants_array: true
end
end
如果符合以下条件,您可以确认Ransack正在使用添加的方法:
User.search(roles_contains: [3,4]).result.to_sql
生成此SQL:
SELECT "users".* FROM "users" WHERE ("users"."roles" @> '{"3","4"}')
现在让这些新方法与Active Admin配合使用。
ActiveAdmin.register User do
filter :roles_array_contains, as: :select, multiple: true, collection: ['foo', 'bar']
end
当然,请务必将User
和roles
更改为适合您情况的模型和属性。
最后一点说明。我注意到您在模型中手动设置了serialize :attr, Array
。要使您的阵列成为PostgreSQL阵列,您必须在数据库迁移中指定array: true
。假设您已经这样做了,那么这个serialize
调用是不必要的。事实上,由于某种原因,它似乎打破了这种方法,所以一定要删除它。