如何创建{x = y | y = z | z = 0}从哈希动态阻止?

时间:2014-10-28 13:14:58

标签: ruby-on-rails ruby chewy-gem

虽然上下文可能无关紧要,但我使用Chewy gem来使用此代码过滤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 个答案:

答案 0 :(得分:2)

不确定您的结构究竟是什么样的,或者您确实想要实现的目标,但是您尝试过这样的事情吗?

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方法来设置条件的连接类型,因此它应该对您有效。