我有以下型号:
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
我没有得到什么问题。请帮帮我
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
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%}')