Activeadmin:如何筛选与两个或多个搜索词匹配的字符串

假设我有一个带有:email字段的User类。 我们假设我使用activeadmin来管理用户。

制作一个返回与一个字符串匹配的电子邮件的filter,例如“smith”,非常简单。 在admin/user.rb ,我只包含该行

 filter :email 

这给了我一个完成工作的filter小部件。

但是,此filter不允许我搜索多个项的交集。 我可以搜索包含“smith”的电子邮件,但不能搜索包含“smith”和“.edu”的电子邮件。

Google告诉我,activerecord在引擎盖下使用Ransack ,而Ransack演示具有允许多项搜索的“高级”模式。

将多项搜索小部件放入activeadmin的最简单方法是什么?

理想情况下,我想要一个小部件,允许我输入smith .edusmith AND .edu来过滤包含这两个术语的电子邮件。

使用可运行的范围有简单的解决方案

所以在你的模型中加入这样的东西

 class User < ActiveRecord::Base .... scope :email_includes, ->(search) { current_scope = self search.split.uniq.each do |word| current_scope = current_scope.where('user.email ILIKE ?', "%#{word}%") end current_scope } def self.ransackable_scopes(auth_object = nil) [ :email_includes] end end 

在此之后,您可以添加AA DSLfilter

喜欢

  filter :email_includes, as: :string, label: "Email" 

UPD

如果将email_contains_any更改为email_includes应该有效

我已经找到了解决方案,但它并不漂亮。

好消息是Ransack在多项搜索方面没有任何问题。 这些搜索使用’谓词’ cont_all 。 以下行用于查找包含“smith”和“.edu”的电子邮件。

 User.ransack(email_cont_all: ['smith','.edu'] ).result 

由于这些搜索在Ransack中很容易,因此在Activeadmin中它们可能很简单,对吧? 错误! 为了让他们工作,我需要做三件事。

  1. 我将一个自定义的搜索方法(也称为User.rb )放入User.rb 我将email_multiple_terms命名为email_multiple_terms

     class User < ActiveRecord::Base # ... ransacker :email_multiple_terms do |parent| parent.table[:path] end 
  2. 我在activeadmin仪表板中声明了一个filter,并将其与ransacker相关联。 请注意,搜索谓词cont_all会附加到搜索引擎名称。

admin/User.rb

 ActiveAdmin.register User do # ... filter :email_multiple_terms_cont_all, label: "Email", as: :string 

此行在Activeadmin中创建filter小部件。 我们快到了。 剩下的一个问题是:Activeadmin将搜索查询作为单个字符串发送到ransack(例如"smith .edu" ),而我们的搜索者希望将搜索项作为数组。 在某个地方,我们需要将单个字符串转换为搜索项数组。

  1. 我修改了activeadmin以在某些条件下拆分搜索字符串。 逻辑是我添加到lib / active_admin / resource_controller / data_access.rb的方法。

     def split_search_params(params) params.keys.each do |key| if key.ends_with? "_any" or key.ends_with? "_all" params[key] = params[key].split # turn into array end end params end 

然后我在apply_filtering调用了这个方法。

  def apply_filtering(chain) @search = chain.ransack split_search_params clean_search_params params[:q] @search.result end 

这段代码存放在我自己的activeadmin分支中,在这里: https : //github.com/dH-/activeadmin

因此,要使多项术语搜索工作,请按照上面的步骤1和2,在我的Gemfile中包含我的AA分支:

  gem 'activeadmin', :git => 'git://github.com/dH-/activeadmin.git' 

HTH。

如果有人有更简单的方法,请分享!

只需在模型中添加三个filter:

 filter :email_cont filter :email_start filter :email_end 

它为您提供了一种灵活的方式来管理您的搜索。

在此处输入图像描述

此filter执行下一个sql代码:

 SELECT "admin_users".* FROM "admin_users" WHERE ("admin_users"."email" ILIKE '%smith%' AND "admin_users"."email" ILIKE '%\.edu') ORDER BY "admin_users"."id" desc LIMIT 30 OFFSET 0 

我期待你正在寻找的东西。