我正在浏览我的数据库中有很多可选列的表。我想找到数据库中每条记录都有数据的列。
我尝试做的简化示例如下:
[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时,这不是最佳解决方案。
答案 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]