Как создать { x = y | y = z | z = 0 } блокировать динамически из хеша?
Хотя контекст, скорее всего, не имеет значения, я использую гем Chewy для фильтрации результатов Elasticsearch с помощью этого кода:
scope = scope.filter {
(send('facet_properties').send(property_ids[0], :or) == val.map(&:to_i)) |
(send('facet_properties').send(property_ids[1], :or) == val.map(&:to_i))
}
Я ищу способ перебрать каждый элемент в property_ids
вместо того, чтобы звонить property_ids[0]
, property_ids[1]
и т. д., разделенные or
индивидуально. В реальном использовании property_ids
не будет фиксированной длины.
1 ответ
Решение
Не знаете точно, как выглядит ваша структура или чего именно вы пытаетесь достичь, но пробовали ли вы что-то подобное?
vals = val.map(&:to_i)
prop_hash = Hash[property_ids.map{|prop| [prop,vals]}]
# alternately prop_hash = property_ids.each_with_object({}){|prop,obj| obj[prop] = vals}
scope.filter(facet_properties: {prop_hash}).filter_mode(:or)
поскольку chewy
имеет #filter_mode
метод, чтобы установить тип соединения, где условия, кажется, это должно работать для вас.