加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:13:24 所属栏目:百科 来源:网络整理
导读:我在ActiveAdmin中添加了以下过滤器. filter :roles,as: :select,collection Model::ROLES,multiple: true 但是当我选择过滤器值来搜索角色时.它给了我以下错误 PG::InvalidTextRepresentation: ERROR: malformed array literal: "teacher"LINE 1: ...ted" =
我在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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读