Как создать { 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 метод, чтобы установить тип соединения, где условия, кажется, это должно работать для вас.

Другие вопросы по тегам