我在ActiveAdmin中添加了以下过滤器.
- filter :roles,as: :select,collection Model::ROLES,multiple: true
- PG::InvalidTextRepresentation: ERROR: malformed array literal: "teacher"LINE 1: ...ted" = $1 AND roles" IN('teacher
- DETAIL: Array value must start with "{" or dimension information. ^
任何的想法 ?我们如何使用AA过滤器搜索/过滤ARRAY字段?我正在使用Rails 4.2.4,
ruby2.2.2p95
解决方法
我在这里找到了一个稍微不同(并受其启发)的解决方案:
https://stackoverflow.com/a/45728004/1170086
我的涉及一些变化(并防止在其他情况下破坏包含运算符).所以,你基本上会创建两个初始化文件:
这个是为了Arel,为了支持@>给定表列的operator(数组包含PG的运算符).
- # config/initializers/arel.rb
- module Arel
- class Nodes::ContainsArray < Arel::Nodes::Binary
- def operator
- :"@>"
- end
- end
- class Visitors::Postgresql
- private
- def visit_Arel_Nodes_ContainsArray(o,collector)
- infix_value o,collector,' @> '
- end
- end
- module Predications
- def contains(other)
- Nodes::ContainsArray.new self,Nodes.build_quoted(other,self)
- end
- end
- end
另一个文件旨在创建一个新的Ransack谓词,但我也决定支持:数组类型(在谓词方面,Ransack本身不支持).
- # config/initializers/ransack.rb
- module Ransack
- module Nodes
- class Value < Node
- alias_method :original_cast,:cast
- def cast(type)
- return Array(value) if type == :array
- original_cast(type)
- end
- end
- end
- end
- Ransack.configure do |config|
- config.add_predicate 'contains_array',arel_predicate: 'contains',formatter: proc { |v| "{#{v.join(',')}}" },validator: proc { |v| v.present? },type: :array
- end
而在其他方面使用它.您需要做的就是:
- User.ransack(roles_contains_array: %i[admin manager])
或者作为ActiveAdmin中的过滤器(我的情况):
- ActiveAdmin.register User do
- # ...
- filter :roles_contains_array,collection: User.roles_for_select
- # ...
- end
我希望它适合你,因为它对我有用.