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"}}
同样的结果。
我们有一个 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"}}
同样的结果。