ransackable_scopes のスコープでの activeadmin フィルターの作成

概要

User モデルと関連付けられたモデルのページに activeadmin フィルターを作成したいと考えています。 first_name フィールドと last_name フィールドを組み合わせたカスタム スコープmatches_nameを使用したいと思います。そのスコープをモデルの ransackable_scopes メソッドに追加したので、Rails コンソールでクエリできるようになりました。

次のようにフィルターを指定しました。

filter :user_matches_name, as: :string, label: "User"

ただし、ページをロードすると、次のメッセージが表示されてエラーになります。

undefined method `user_matches_name_contains' for Ransack::Search<class: MyModel, base: Grouping <combinator: and>>:Ransack::Search

同様のエラーが発生することなく、ユーザー activeadmin ページにフィルターを作成できました。

filter :matches_name, as: :string, label: "User"

ransack または activeadmin がフィルターの最後に余分な _contains を追加しないようにする方法はありますか?

解決策

ransacker を使用して、User クラスの first_name と last_name (full_name など) を結合し、User モデルに関連付けられている ActiveAdmin リソース ファイルから次のフィルターを使用できます。 フィルター:user_full_name、as: :string、ラベル: ‘ユーザー’

私のモデルリソースの登録

ActiveAdmin.register MyModel do
  actions :index

  filter :user_full_name, as: :string, label: 'User'
end

ユーザーリソースの登録

ActiveAdmin.register User do
  actions :index
end

ユーザーモデルとMyModelモデル

class MyModel < ApplicationRecord
  belongs_to :user

  def self.ransackable_associations(auth_object = nil)
    %w[user]
  end

  def self.ransackable_attributes(auth_object = nil)
    %w[created_at id id_value updated_at user_id]
  end
end

class User < ApplicationRecord
  ransacker :full_name do |parent|
    Arel::Nodes::InfixOperation.new('||', parent.table[:first_name], parent.table[:last_name])
  end

  def self.ransackable_attributes(auth_object = nil)
    %w[created_at first_name full_name id id_value last_name updated_at]
  end
end

このコードは、ActiveAdmin gem の 3.x.x バージョンと 2.x.x バージョンの両方で適切に動作するはずです。