ruby-on-rails – postgres Array字段上的ActiveAdmin Filter

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – postgres Array字段上的ActiveAdmin Filter前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在ActiveAdmin中添加了以下过滤器.
  1. filter :roles,as: :select,collection Model::ROLES,multiple: true

但是当我选择过滤器值来搜索角色时.它给了我以下错误

  1. PG::InvalidTextRepresentation: ERROR: malformed array literal: "teacher"LINE 1: ...ted" = $1 AND roles" IN('teacher
  2. 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的运算符).

  1. # config/initializers/arel.rb
  2.  
  3. module Arel
  4. class Nodes::ContainsArray < Arel::Nodes::Binary
  5. def operator
  6. :"@>"
  7. end
  8. end
  9.  
  10. class Visitors::Postgresql
  11. private
  12.  
  13. def visit_Arel_Nodes_ContainsArray(o,collector)
  14. infix_value o,collector,' @> '
  15. end
  16. end
  17.  
  18. module Predications
  19. def contains(other)
  20. Nodes::ContainsArray.new self,Nodes.build_quoted(other,self)
  21. end
  22. end
  23. end

另一个文件旨在创建一个新的Ransack谓词,但我也决定支持:数组类型(在谓词方面,Ransack本身不支持).

  1. # config/initializers/ransack.rb
  2.  
  3. module Ransack
  4. module Nodes
  5. class Value < Node
  6. alias_method :original_cast,:cast
  7.  
  8. def cast(type)
  9. return Array(value) if type == :array
  10. original_cast(type)
  11. end
  12. end
  13. end
  14. end
  15.  
  16. Ransack.configure do |config|
  17. config.add_predicate 'contains_array',arel_predicate: 'contains',formatter: proc { |v| "{#{v.join(',')}}" },validator: proc { |v| v.present? },type: :array
  18. end

而在其他方面使用它.您需要做的就是:

  1. User.ransack(roles_contains_array: %i[admin manager])

或者作为ActiveAdmin中的过滤器(我的情况):

  1. ActiveAdmin.register User do
  2. # ...
  3. filter :roles_contains_array,collection: User.roles_for_select
  4. # ...
  5. end

我希望它适合你,因为它对我有用.

猜你在找的Ruby相关文章