[英]Custom search with ransacker
我正在嘗試向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"]
。
在應用過濾器之前:
應用過濾器后:
任何想法如何解決這一問題?
可轉換的范圍有一個等待合並的功能: https : //github.com/activerecord-hackery/ransack/pull/288
更新:
我已經將avit和glebm的工作另外與PR https://github.com/activerecord-hackery/ransack/pull/390合並了,因此現在可以將范圍與Ransack一起使用。 有關文檔,請參閱提交:
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。
in
或cont_any
通過數組進行搜索。 所以在這種情況下,它正在搜索Model.where(something: ["tom", "tom1", "tom2"]
並且由於params [:q]的工作方式,它將它作為數組返回到您的輸入我為幫助用戶體驗所做的快速而骯臟的修復是增值value: nil,
輸入表單
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.