查找一组 n 个数组中存在哪些公共元素的简洁方法是什么?

what's a clean way of finding which common elements exist in a set of n arrays?

我正在浏览我的数据库中的 table,其中有很多可选列。我想在我的数据库中的每条记录中找到包含数据的列。

我正在尝试做的一个简化示例如下:

[1,2,3,4,5] & [1,2,3,4] & [1,2,3] & [1,2]
#=> [1,2]

但是,我想要做的是 运行 这种针对数千条记录的操作。什么是完成此操作的干净方法?我感觉 ruby 可能对这类事情有一些定制的方法。

这是我决定写这个问题之前要做的事情:

sets_of_columns_with_data = TableName.all.map(&:attributes).map do |attrs| 
    attrs.select {|k,v| v}
end.map(&:keys)

所以此时,如果您遵循上面的代码,columns_with_data 现在相当于:

sets_of_columns_with_data = [
  [1,2,3,4,5],
  [1,2,3,4],
  [1,2,3]
  [1,2]
 ]

我想这是一种混乱的方式,看起来像这样:

always_used = sets_of_columns_with_data.first
sets_of_columns_with_data.each do |columns_with_data|
  always_used = always_used & columns_with_data
end

什么是干净的,ruby-做这样的事情的方法?

谢谢

注意:

为了清楚起见,我保留了业务逻辑,但通常这不是您可以使用 SQL 时的最佳解决方案。

我不确定这是否解决了实际问题,但要应用二元运算,您可以使用 reduce:

sets_of_columns_with_data = [
  [1, 2, 3, 4, 5],
  [1, 2, 3, 4],
  [1, 2, 3],
  [1, 2]
]

sets_of_columns_with_data.reduce(:&) #=> [1, 2]