ElasticSearch 处理 Rails 带有嵌套对象的路由参数

ElasticSearch handling Rails route params with nested objects

我们有一个 Rails 搜索路由,它可以接受应该映射到 ElasticSearch 运算符的嵌套对象。

例如:

{
  name: "John",
  age: {
    {gte: 20}
  }
}

问题是当 Rails 路由参数如下所示时,SearchKick 库会抛出错误:

{"name"=>["Sam Terrick", "John Terrick"], "age"=>{"gte"=>"20"}}

Searchkick 库通过这些过滤器进行映射并对 :gte 进行大小写比较,但哈希火箭键不匹配。 ActiveSupport::HashWithIndifferentAccess 没有完成任务。

https://github.com/ankane/searchkick/blob/master/lib/searchkick/query.rb

是否有一种优雅的方法来处理路由参数中嵌套对象的这种转换,而无需检查每个参数是否为哈希?

为此你可以使用 Rails Hash.html#method-i-deep_transform_keys:

params = {"name"=>["Sam Terrick", "John Terrick"], "age"=>{"gte"=>"20"}}
p params.deep_transform_keys(&:to_sym)
# {:name=>["Sam Terrick", "John Terrick"], :age=>{:gte=>"20"}}

但是 Rails 还实现了其他方便的方法,在这种情况下更准确,Hash.html#deep_symbolize_keys:

p params.deep_symbolize_keys
# # {:name=>["Sam Terrick", "John Terrick"], :age=>{:gte=>"20"}}

同样的结果。