序列化属性的活动管理员自定义过滤器

时间:2019-02-11 11:11:48

标签: ruby-on-rails ruby activeadmin

我有以下型号:

Class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

我的个人资料中有“技能”列,其中存储了一系列技能。我正在使用Rails Active Admin,并在使用技能过滤用户时遇到了

问题
  

PG :: InvalidTextRepresentation:错误:格式不正确的数组文字:“ java”

我的过滤器代码是:

filter :profile_skills, label: 'Skills', as: :string

我没有发现问题所在。请帮帮我

1 个答案:

答案 0 :(得分:0)

ActiveAdmin使用ransack gem进行过滤。使用ransack按数组过滤的最简单方法是在模型中定义范围:

class Profile < ApplicationRecord
  # @!method skills_includes(skill)
  #   @param skill [String]
  #   @return [ActiveRecord::Relation<Profile>]
  scope :where_skills_contains, ->(skill) { where("skills @> ?", "{#{skill}}") }
end

使用此范围,您可以按Profile. skills_include('java')这样的技能来过滤配置文件。

默认情况下,洗劫不允许使用范围进行过滤,因此您必须whitelist使用此范围:

class Profile
  def self.ransackable_scopes(*)
    %i(where_skills_contains) 
  end

  private_class_method :ransackable_scopes
end

现在在过滤器中可能存在可洗范围:

filter :where_skills_contains, label: :skills, as: :string

请注意,您不能命名过滤器(和作用域)skills_contains,因为它会生成与数据库完全不同的查询。

> Profile.ransack(where_skills_contains: 'java').result.to_sql 
#=> SELECT "profiles".* FROM "profiles" WHERE (skills @> '{java}')
> Profile.ransack(skills_contains: 'java').result.to_sql
#=> SELECT "profiles".* FROM "profiles" WHERE ("profiles"."skills" ILIKE '{%java%}')