Pluck не возвращает надоедливые записи, они имеют одинаковое имя

У меня есть срыв, который превращается в хеш и сохраняется в переменной

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

Если 2 записи имеют одинаковые :key name, тогда используется только самая последняя запись, и они оба не добавляются в хеш. Но если они имеют одинаковые value и разные keys оба добавляются в хеш.

Это также происходит, если я поменяюсь :key а также :value вокруг (.pluck(:value, :key)). Если у них сейчас то же самое value он использует только самый последний и сохраняет его в хэше. Но имея то же самое key сейчас в порядке.

Я не уверен, что это вызвано извлечением или сортировкой в ​​хеше. Я склоняюсь к срыву, являющемуся виновником.

Что является причиной этого и как я могу предотвратить это. Я не хочу, чтобы данные пропускались, если они имеют одинаковые key назвать в качестве еще одной записи.

1 ответ

Решение

Я не уверен, зачем вам нужно преобразовывать результат в хэш, потому что это был оригинал Array.

Как будто у тебя три 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] }

Другие вопросы по тегам