使用ransacker进行自定义搜索

时间:2014-03-18 07:57:29

标签: ruby-on-rails activeadmin ransack

我正在尝试向ActiveAdmin添加自定义过滤器,这些过滤器最近由Ransack提供支持。遗憾的是,ransacker根本没有记录,而且从网上的少数资源中我偶然发现了以下内容(在用户模型中):

ransacker :full_text, formatter: ->(search) {
  ids = User.search_in_all_translated(search).map(&:id)
  ids = ids.any? ? ids : nil
} do |parent|
  parent.table[:id]
end

search_in_all_translated方法返回一个用户数组,这些用户匹配所有已翻译属性的搜索字符串。

在管理页面上,定义了以下过滤器:

filter :full_text_in,
  label: 'full text search',
  as: :string

过滤器本身有效,因此过滤tom将列出所有匹配的记录。但是,过滤器输入中的值会切换为["tom"]

在应用过滤器之前:

enter image description here

应用过滤器后:

enter image description here

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:17)

有一个等待合并的可搜集范围的功能: https://github.com/activerecord-hackery/ransack/pull/288

更新:

我已经将avit和glebm的工作另外与PR https://github.com/activerecord-hackery/ransack/pull/390合并了,因此现在可以将范围与Ransack一起使用。有关文档,请参阅commit:

https://github.com/svoop/ransack/commit/72dd5d12d58919bf37199234cf13f9533f3b8cd5

这是一个真实的例子:

class Project < ActiveRecord::Base
  scope :full_text_search, ->(search) { search_in_all_translated(search) }

  def self.ransackable_scopes(auth_object = nil)
    [:full_text_search]
  end
end

在此示例中,search_in_all_translated返回一些复杂的索引全文搜索SQL。

答案 1 :(得分:0)

incont_any通过数组进行搜索。所以在这种情况下,它正在进行搜索Model.where(something: ["tom", "tom1", "tom2"],并且由于params [:q]的工作方式,它将它作为数组返回到您的输入。我为帮助用户体验所做的快速而肮脏的修复已添加value: nil,到输入表单