簡體   English   中英

序列化屬性的活動管理自定義過濾器

[英]active admin custom filter for serialized attribute

我有以下型號:

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按數組過濾的最簡單方法是在模型中定義范圍:

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') Profile. skills_include('java')

默認情況下,ransack 不允許使用范圍進行過濾,因此您必須將此范圍列入白名單

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%}')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM