什么是一种简洁的方法来查找一组n个数组中存在哪些常见元素?

时间:2016-02-05 16:24:28

标签: ruby set refactoring

我正在浏览我的数据库中有很多可选列的表。我想找到数据库中每条记录都有数据的列。

我尝试做的简化示例如下:

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

但是,我尝试做的是为数千条记录运行此类操作。什么是干净的方法来实现这一目标?我觉得红宝石可能有一些定制的方法来处理这类事情。

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

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

干净,红宝石的做法是什么?

由于

注:

为了清晰起见,我保留了业务逻辑,但一般情况下,当您可以使用SQL时,这不是最佳解决方案。

1 个答案:

答案 0 :(得分:3)

我不确定这是否解决了实际问题,但是要应用二进制操作,您可以使用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]