Слить два хэша в ruby - PullRequest
0 голосов
/ 19 июня 2019

У меня есть две коллекции хэшей

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

но ошибка Ожидается: { отображается в коде. Видимо, второй цикл плохо синтаксически

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Похоже, вы хотите каждую комбинацию данного and_filters с данным or_filters.В этом случае и при условии, что вы не заботитесь о заказе (:gender до :brand и наоборот) Array#product ваш друг:

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: https://repl.it/@jrunning/HorizontalDirectCharmap

1 голос
/ 19 июня 2019

Это не красиво, но я считаю, что это дает желаемые результаты:

{_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
}

Что дает:

{:_or => [
  { :_and => [
    {:gender=>"Hombre"}, 
    {:brand=>"Fila"}
  ]}, 
  { :_and => [
    {:gender=>"Hombre"}, 
    {:brand=>"Adidas"}
  ]}
]}
0 голосов
/ 21 июня 2019

Вот что я искал

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

https://repl.it/repls/ShyLateClients

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...