Pluck 没有 return 打扰记录他们有相同的名字

Pluck doesn't return a bother records they have the same name

我有一个 pluck 被转换成散列并存储在一个变量中

@keys_values_hash = Hash[CategoryItemValue.where(category_item_id: @category_item.id).pluck(:key, :value)]

如果 2 条记录具有相同的 :key 名称,则仅使用最近的记录,它们不会同时添加到哈希中。但是如果它们具有相同的 value 和不同的 keys 两者都被添加到散列中。

如果我在 (.pluck(:value, :key)) 周围交换 :key:value,也会发生这种情况。如果他们现在有相同的 value 它只使用最近的一个并将其存储在哈希中。但是拥有相同的 key 现在没问题了。

我不确定这是由 pluck 引起的,还是由哈希排序引起的。我倾向于 pluck 是罪魁祸首。

这是什么原因造成的,我该如何阻止它发生。我不想跳过与另一条记录具有相同 key 名称的数据。

我不确定你为什么需要将 pluck 结果转换为哈希,因为它是一个原始数组。

就像你有三个 CategoryItemValue 如下:

id,   key,   value
 1,    foo,   bar1
 2,    foo,   bar2
 3,    baz,   bar3

当你直接提取它们时,你会得到一个像这样的数组:
[ ['foo', 'bar1'], ['foo', 'bar2'], ['baz', 'bar3'] ]

但是当你把它转换成散列时,你会得到:
{'foo' => 'bar2', 'baz' => 'bar3' }

因为如果键(上例中的 foo)存在,新的哈希值将覆盖旧的哈希值。

或者您可以尝试 Enumerable#group_by 方法:
CategoryItemValue.where(...).pluck(:key, :value).group_by { |arr| arr[0] }