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 バージョンの両方で適切に動作するはずです。