Больше невозможно сериализовать как ActiveSupport :: HashWithIndifferentAccess - PullRequest
5 голосов
/ 19 января 2012

По причинам, которые я до сих пор полностью не могу расшифровать, я больше не могу использовать ActiveSupport :: HashWithIndifferentAccess.

Соответствующая часть модели выглядит следующим образом:

class Item < ActiveRecord::Base
  serialize :metadata, ActiveSupport::HashWithIndifferentAccess

(Я добавил опцию, чтобы попытаться заставить его действовать, но это не помогло. Раньше все это работало нормально, и у меня не было этого.)

До тех пор, покаобъект находится в памяти, все отлично работает.Это правильно HashWithIndifferentAccess, и жизнь хороша.Как только он сохраняется в базе данных, он вместо этого сохраняется как Hash:

mysql> select * from items;
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
| id | link | text        | metadata                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | category_id |
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
|  1 | NULL | Apple Store | ---
id: 42cc7080f964a520e9251fe3
name: Apple Store
contact:
  phone: '4153920202'
  formattedPhone: (415) 392-0202
location:
  address: 1 Stockton St.
  crossStreet: at Ellis St.
  lat: '37.78573590563453'
  lng: '-122.40610713227913'
  distance: '1784'
  postalCode: '94108'
  city: San Francisco
  state: CA
  country: USA
categories:
  '0':
    id: 4bf58dd8d48988d122951735
    name: Electronics Store
    pluralName: Electronics Stores
    shortName: Electronics
    icon: https://foursquare.com/img/categories/shops/technology.png
    parents:
    - Shops & Services
    primary: 'true'
verified: 'false'
stats:
  checkinsCount: '30462'
  usersCount: '16105'
  tipCount: '128'
url: http://apple.com/sanfrancisco
hereNow:
  count: '7'
 | 1           |
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+

Это означает, что его нельзя принудительно вернуть обратно в HashWithIndifferentAccess, и все будет взорвано так:

ActiveRecord::SerializationTypeMismatch in Index#index

Showing /development/lists.io/website/app/views/users/_todo.html.haml where line #7 raised:

Attribute was supposed to be a ActiveSupport::HashWithIndifferentAccess, but was a Hash

Используется Rails 3.1.3, для хранения данных в MySQL используется версия gem mysql2 0.3.10.Я также использую Ruby 1.9.2p290.Я могу добавить больше информации, которую любой посчитал бы полезной, но я не знаю, как отлаживать это дальше.

Ответы [ 4 ]

4 голосов
/ 03 февраля 2012

1.9.2 обычно включает Psych в качестве библиотеки YAML.Однако libyaml является внешней зависимостью, и 1.9.2 по умолчанию использует Syck (старая библиотека), если libyaml недоступен при компиляции Ruby: link

Тот факт, что Psych YAMLizes ActiveSupport :: HashWithIndifferentAccess в качестве стандартного хеша - это выдающаяся проблема в Github от Psych.Кажется, исправлено в 1.9.3.

3 голосов
/ 19 января 2012

Очевидно, что это просто сломано с 1.9.2-p290.

Обновление до 1.9.3 или понижение до 1.8.7, и все хорошо. Я хотел бы получить лучший ответ, чем этот, если бы у кого-нибудь были какие-либо идеи.

0 голосов
/ 10 мая 2013

На случай, если у кого-то возникнет та же проблема, что и у меня, похожая на эту, но не та, я выкладываю ответ здесь. У меня есть хеш, который сериализован в модели, который правильно сохраняет в БД. В одном интерфейсе мне нужно восстановить хеш в JS, который затем создал бы записи в базе данных, содержащей! Map: ActiveSupport :: HashWithIndifferentAccess, а не правильные данные. Я генерирую хэш в виде строки, а затем преобразую в хэш с помощью eval. Это создало хэш, как требуется. Но затем я помещал хэш обратно в хэш params, чтобы я мог использовать update_attributes в контроллере, который преобразовывал его в HashwithIndifferentAccess, вызывая проблему

0 голосов
/ 07 марта 2013

Если можете, переключитесь на syck.

В приложении .rb:

require 'yaml'
YAML::ENGINE.yamler = 'syck'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...