【发布时间】:2015-12-03 15:19:43
【问题描述】:
我正在尝试在 Active Admin 中对单个输入字段中客户的名字和姓氏进行过滤。 first_name 和 last_name 是单独的字段。
如果您有中间名,我的解决方案将失败。如果客户的名字是“John H. Smith”,那么“John”和“Smith”会给出正确的结果,但“John Smith”会因为多余的“H.”而找不到任何东西。
ActiveAdmin.register Customer do
...
filter :full_name_cont, label: 'Name', as: :string
end
# In the Customer model:
ransacker :full_name, formatter: proc { |full_name| full_name.downcase.to_s } do |parent|
Arel::Nodes::InfixOperation.new('||',
Arel::Nodes::InfixOperation.new('||',
parent.table[:first_name], ' '
),
parent.table[:last_name]
)
end
所以现在我尝试将搜索词“John H. Smith”作为参数发送给 ransacker,这样我就可以将名称分成多个部分并搜索其中任何一个与名字或姓氏匹配:
ransacker :full_name, args: [:parent, :ransacker_args] do |parent, args|
full_name = args.first
search_items = full_name.split(" ")
condition = "concat_ws(first_name, ' ', last_name) LIKE '%#{search_items.first}%'"
search_items.each do |item|
condition += " OR concat_ws(first_name, ' ', last_name) LIKE '%#{item}%'" if item != search_items.first
end
Arel.sql(condition)
end
很遗憾,args 始终为空。
有谁知道如何向 ransacker 发送参数?
【问题讨论】:
-
是的,这就是我的目标。但我不确定如何在过滤器中插入类似的东西:
Person.ransack( c: [{ a: { '0' => { name: 'author_max_title_of_article_where_body_length_between', ransacker_args: [10, 100] } }, p: 'cont', v: ['Ransackers can take arguments'] }] ) -
@ElenaTanasoiu 请查看github.com/activerecord-hackery/ransack/issues/…
-
您在这里找到解决方案了吗?
-
是的,我已经在下面添加了答案
标签: ruby-on-rails ruby filter activeadmin arel