我正在使用Ruby On Rails,我有两个SQL查询,每个查询都返回一个对象数组。这两个SQL查询来自两个独立的DB,因此它们具有不同的字段,但是,我应该将结果合并到一个列表中。下面是两个SQL查询的示例以及最终结果应该是什么样子。
SQL1 result == [{id1: 1, name: john, role: user},{id1: 2, name: matt, role: admin}]
SQL2 result == [{id2: 4, externalName: john},{id2: 8, externalName: ronald}]
字符串
我们希望将name == externalName的所有对象合并到一个对象中,但保留其余对象。
RESULT == [{id1: 1, name: john, role: user, id2: 4},{id1: 2, name: matt, role: admin},{id2: 8, externalName: ronald}]
型
基本上,我想把两个列表加在一起,但是,当第二个列表中的:externalName等于第一个列表中的:name值时,或者反之亦然,我们想把这两个独立的对象合并合并成一个,因为它们会被认为是“重复的”。两个对象的合并结果看起来像这样{:id1, :name, :role, :id2}
。其余不满足这个条件的对象仍然会出现在结果数组中。
我已经做了一个concat,它只是把两个数组加在一起成为一个漂亮的数组,但是它不会在name == externalName上合并。我想过使用.merge(),但不确定如何在两个完整的对象数组上做到这一点,以及如果不满足合并条件会发生什么,这些仍然会出现在结果列表中。我也想过一个Map,但然后需要弄清楚如何删除合并后的结果对象。不知道什么是最好的方法是现在,只是寻找一些提示。
3条答案
按热度按时间m4pnthwp1#
您可以按如下方式执行此操作:
字符串
步骤:
[*sql1,*sql2]
-合并合并两个阵列.group_by {|h| h[:name] || h[:externalName]}
-如果h[:name]
为falsey,则按:name
或:externalName
的值对元素进行分组(在本例中假定为nil
)map do |_,v|
-将根据块的返回值返回一个新的Array,当在Hash
上调用时(由group_by
返回),它将产生块的键和值。在这种情况下,我们不关心键,所以我们使用_
来表示。v.reduce(&:merge)
-将值合并为单个Hash
tap { |h| h.delete(:externalName) if h.key?(:name) }
-tap
将结果Hash
生成到块中,如果Hash
有name
键,则删除:externalName
键。此块将始终返回生成的对象。更新显然
name
不是必需的键,导致nil
值的一大组,其中合并减少不是一个选项。更新代码以处理nil
分组。型
以下是基于员额的假设:
sql1
中没有重复的名称,sql2
中没有重复的externalNames
(导致最多2个组; 1个值来自sql1
,1个值来自sql2
)sql1
和sql2
之间没有重叠的键。否则,结果值将是sql2
的值eanckbw92#
这个可以
字符串
或
型
结果
型
dddzy1tm3#
在阅读了对@engineersmnky的回答的评论后,我发现这个问题已经有所变化。假设
sql1
和sql2
如下(摘自@engineersmnky的回答)。个字符
获得所需结果的一种方法如下。
x
的一种或多种