2016-02-17 15 views
0

У меня есть срывать, который включается в хэш и хранящийся в переменнойЛивер не возвращается беспокоить записи, которые они имеют такое же имя

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

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

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

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

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

+1

срывать нет виновника. Хэш не может иметь дубликаты ключей. – Nithin

+1

check http://stackoverflow.com/a/25447081/2231236 – Nithin

ответ

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] }

+0

Я использую механизм шаблона [жидкость] (https://github.com/Shopify/liquid), который требует, чтобы информация была в хеше не массивом К сожалению. Каким-то образом это предотвращает хеш? – Rob

+0

@ user3234020 Он может преобразовать результат вырезания в хэш на 'Array.to_h'. Но я не думаю, что вы можете назначить две переменные одной переменной в жидком шаблоне шаблонов. Подумайте, когда вы получите '[% w (foo bar1),% w (foo bar2)]', как можно было бы визуализировать '{{foo}}' переменную? это 'bar' или' bar2'? Поэтому он также потребовал уникальный ключ. –

+0

Я планировал иметь способ или утверждение, что если бы два ключа были одинаковыми, чтобы поместить значение одного в другое, например. '{'foo' => 'bar2', 'foo' => 'bar3'}' становится {'foo' => 'bar2, bar3'}, который работает для моего приложения. Я просто понял, что могу сделать это для массива, прежде чем он будет преобразован в хэш. '[['foo', 'bar1'], ['foo', 'bar2'], ['baz', 'bar3']]' в '[['foo', 'bar1, bar2'], [' baz ',' bar3 ']] 'теперь, чтобы понять, как это сделать. – Rob

 Смежные вопросы

  • Нет связанных вопросов^_^