Ruby on rails 在ruby中合并两个哈希
我有两个散列集合Ruby on rails 在ruby中合并两个哈希,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有两个散列集合 and_filters = [{:filter=>:brand, :value=>"Fila"}, {:filter=>:brand, :value=>"Adidas"}] or_filters = [{:filter=>:gender, :value=>"Hombre"}] 我需要制作如下结构 :_or => [ { :_and => [ {:gender => "Hombre"}, {:brand
and_filters = [{:filter=>:brand, :value=>"Fila"}, {:filter=>:brand, :value=>"Adidas"}]
or_filters = [{:filter=>:gender, :value=>"Hombre"}]
我需要制作如下结构
:_or => [
{ :_and => [
{:gender => "Hombre"},
{:brand => "Adidas"}]
},
{ :_and => [
{:gender=>"Hombre"},
{:brand=>"Fila"}]
}
]
为此,我做到了
query[:_or] = []
or_filters.each do |or_f|
query[:_or] << {
:_and => [
and_filters.map do |and_f|
{and_f[:filter] => and_f[:value]}
end
{ or_f[:filter] => or_f[:value] }
]
}
end
query[:\u或]=[]
或|过滤器。每个过滤器都有|或| f|
查询[:\u或][
和_filters.map do |和_f|
{and_f[:filter]=>and_f[:value]}
结束
{或_f[:filter]=>或_f[:value]}
]
}
结束
但是预期会出现错误:{在代码中显示。显然,第二个循环在语法上很糟糕这并不漂亮,但我相信这会给出预期的结果:
{_or: or_filters.each_with_object([]) do |or_filter, or_filter_ary|
or_filter_hsh = {or_filter[:filter] => or_filter[:value]}
and_filters.each do |and_filter|
and_filter_hsh = {and_filter[:filter] => and_filter[:value]}
or_filter_ary << {_and: [or_filter_hsh, and_filter_hsh]}
end
end
}
看起来您希望给定的
和\u过滤器的每一个组合都与给定的或\u过滤器相结合。在这种情况下,假设您不关心顺序(:gender
,before:brand
vs.反过来说),您的朋友是:
result = {
_or: and_filters.product(or_filters).map do |a|
{ _and: a.map {|filter:, value:| { filter => value }} }
end
}
# => {
# :_or => [
# {:_and => [{:brand=>"Fila"}, {:gender=>"Hombre"}]},
# {:_and => [{:brand=>"Adidas"}, {:gender => "Hombre"}]}
# ]
# }
请在repl.it上查看它的实际操作:这就是我要找的
query = {}
query[:_or] = or_filters.map do |or_f|
and_filters_aux = and_filters.dup
and_filters_aux << or_f
{ :_and => and_filters_aux.map{|hsh| {hsh[:filter] => hsh[:value]} } }
end
query={}
查询[:_或]=或_filters.map do |或_f|
和_filters_aux=和_filters.dup
和_filters_aux和_filters_aux.map{| hsh{hsh[:filter]=>hsh[:value]}
结束
在什么是查询之后出现了非常严重的语法错误?此代码不完整。我定义为空哈希query={}
query = {}
query[:_or] = or_filters.map do |or_f|
and_filters_aux = and_filters.dup
and_filters_aux << or_f
{ :_and => and_filters_aux.map{|hsh| {hsh[:filter] => hsh[:value]} } }
end