2012-01-18 11 views
5

Z powodów, których jak dotąd nie jestem w stanie odcyfrować, nie mogę już korzystać z ActiveSupport :: HashWithIndifferentAccess.Nie można przekształcać do postaci szeregowej jako ActiveSupport :: HashWithIndifferentAccess już

Istotna część modelu wygląda następująco:

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

(dodałem opcję, aby spróbować zmusić go razem, ale to nie pomogło Poprzednio było to wszystko działa dobrze, a ja nie zrobił”. t tamto tamto.)

Tak długo jak obiekt jest w pamięci, wszystko działa dobrze. To poprawnie HashWithIndifferentAccess, a życie jest dobre. Raz to zostaje zapisany w bazie danych, jest zapisany jako Hash Zamiast:

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   | 
+----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ 

co oznacza, że ​​nie może być zmuszany powrotem do HashWithIndifferentAccess i rzeczy wysadzić tak:

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 

Jest za pomocą Rails 3.1.3, przechowywanie danych w MySQL przy użyciu gem mysql2 w wersji 0.3.10. Używam również ruby ​​1.9.2p290. Mogę dodać więcej informacji, które ktoś mógłby uznać za pomocne, ale nie mam pojęcia, jak dalej to debugować.

Odpowiedz

4

1.9.2 zwykle zawiera Psych jako bibliotekę YAML. Jednak libyaml jest zależność zewnętrzna i 1.9.2 domyślnie używając Syck (Old Library) jeśli libyaml nie jest dostępna, gdy Ruby jest skompilowany: link

fakt, że Psych YAML-izes ActiveSupport :: HashWithIndifferentAccess jako standard hash to oustanding issue na Githubie Psych. Wydaje się być naprawione w 1.9.3.

3

Wygląda na to, że jest po prostu w porządku z wersją 1.9.2-p290.

Aktualizacja do wersji 1.9.3 lub obniżenie do wersji 1.8.7 i wszystko brzoskwiniowe. Chciałbym jednak otrzymać lepszą odpowiedź, jeśli ktoś ma jakieś pomysły.

0

Jeśli możesz, przełącz na syck.

W environment.rb:

require 'yaml' 
YAML::ENGINE.yamler = 'syck' 
0

wszelki wypadek ktoś ma ten sam problem miewam, który jest podobny do tego, ale to nie to samo, jestem delegowania odpowiedzi tutaj. Mam hash, który jest serializowany w modelu, który jest poprawnie zapisywany w db. W jednym interfejsie muszę zregenerować hasz w JS, który następnie utworzyłby wpisy w bazie danych zawierającej: map: ActiveSupport :: HashWithIndifferentAccess zamiast poprawnych danych. Generuję hash jako ciąg znaków, a następnie konwertuję na hasz używając eval. W razie potrzeby utworzyło Hash. Ale potem wstawiłem skrót do wartości mieszania paramów, więc mogłem użyć update_attributes w kontrolerze, który konwertował go do HashwithIndifferentAccess, powodując problem:

Powiązane problemy