在 ransackable_scopes 中的范围上创建 activeadmin 过滤器

问题描述 投票:0回答:1

我想在页面上为与用户模型关联的模型创建一个 activeadmin 过滤器。我想使用自定义范围

matches_name
,它结合了
first_name
last_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

ruby-on-rails ruby activeadmin ransack
1个回答
0
投票

您可以使用 ransacker 组合 User 类的名字和姓氏(例如全名),然后从与用户模型关联的 ActiveAdmin 资源文件中使用此过滤器:

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

注册我的模型资源

ActiveAdmin.register MyModel do
  actions :index

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

用户资源注册

ActiveAdmin.register User do
  actions :index
end

User 和 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

此代码应该可以与 3.x.x 和 2.x.x 版本的 ActiveAdmin gem 一起正常工作

© www.soinside.com 2019 - 2024. All rights reserved.