Ruby 循环多个阵列

Ruby 循环多个阵列,ruby,Ruby,我有一个包含多个数组的数组。数组的有效维数可能不同。一个数组最多可以包含150个对象 对于数组,我需要为匹配条件的每个子数组找到一个组合元素 由于维度的原因,我尝试使用Enumerator::Lazy,如下所示 catch :match do array[0].product(*array[1..-1]).lazy.each do |combination| throw :match if ConditionMatcher.match(combination) end end

我有一个包含多个数组的数组。数组的有效维数可能不同。一个数组最多可以包含150个对象

对于数组,我需要为匹配条件的每个子数组找到一个组合元素

由于维度的原因,我尝试使用Enumerator::Lazy,如下所示

catch :match do
   array[0].product(*array[1..-1]).lazy.each do |combination|
    throw :match if ConditionMatcher.match(combination)
  end
end
然而,我意识到,当我调用每个枚举器时,它会被计算,并且执行得非常慢。 我尝试用Enumerator::Lazy中包含的方法(如take_while)替换每个方法

但是,在这种情况下,产品的性能也很低

为了获得更好的性能,即使我不是很喜欢它,我也在考虑用嵌套的each循环替换产品。差不多

catch :match do
 array[0].each do |first|
   array[1].each do |second|
     array[2].each do |third|
       throw :match if ConditionMatcher.match([first, second, third])
     end
   end
 end
end
由于子阵列的数量会不时发生变化。我不知道如何实施它

此外,是否有更好的方法在不加载整个组合集的情况下循环所有子数组

更新1- 每个子数组都包含多态关联上的ActiveRecord::Relationship。因此,每个组合的每个元素响应相同的两个方法start_time和end_time,每个方法返回一个时间实例

匹配器检查组合中的所有对象是否没有重叠时间。

问题是已经返回了一个包含所有组合的巨大数组。对于每个包含150项的3个子数组,它返回一个150×150×150=3375000元素数组。在该数组上调用lazy不会加快任何速度

要使乘积缓慢地计算笛卡尔乘积,即一个接一个的组合,只需直接向其传递一个块:

first, *others = array

first.product(*others) do |combination|
  # ...
end
问题是已经返回了一个包含所有组合的巨大数组。对于每个包含150项的3个子数组,它返回一个150×150×150=3375000元素数组。在该数组上调用lazy不会加快任何速度

要使乘积缓慢地计算笛卡尔乘积,即一个接一个的组合,只需直接向其传递一个块:

first, *others = array

first.product(*others) do |combination|
  # ...
end

能否给出ConditionMatcher.match的输入和预期参数的一些示例?请参阅更新。我希望它能提供有用的信息。当数据来自数据库时,你是否考虑在SQL中实现它?通常,运行复杂的SQL查询要比将所有记录加载到内存并在Ruby中迭代所有记录快得多。是的,我这样做了,理想情况下,我希望将所有逻辑移到SQL。然而,这些关系不是一个简单的where,而是考虑了多个因素和多个表,我也不知道在SQL中从哪里开始。所以,现在,我想用Ruby来完成它,然后随着时间的推移,将逻辑移到SQL。您能给ConditionMatcher.match一些输入和预期参数的示例吗?请参阅更新。我希望它能提供有用的信息。当数据来自数据库时,你是否考虑在SQL中实现它?通常,运行复杂的SQL查询要比将所有记录加载到内存并在Ruby中迭代所有记录快得多。是的,我这样做了,理想情况下,我希望将所有逻辑移到SQL。然而,这些关系不是一个简单的where,而是考虑了多个因素和多个表,我也不知道在SQL中从哪里开始。所以,现在,我想用Ruby来完成它,然后,随着时间的推移,将逻辑转移到SQL。再次感谢你帮助我。再次感谢你帮助我。