我有以下型号:
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
我没有发现问题所在。请帮帮我
答案 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%}')