ActiveAdmin использует Ransack гем для фильтрации.Простейший способ фильтрации по массиву с помощью 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')
.
По умолчанию ransack не выполняетне разрешать использовать области для фильтрации, поэтому вам необходимо белый список этой области:
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%}')