2012-01-18 32 views
5

Vì lý do tôi hoàn toàn không thể giải mã được, tôi không còn có thể sử dụng ActiveSupport :: HashWithIndifferentAccess nữa.Không thể tuần tự hóa dưới dạng ActiveSupport :: HashWithIndifferentAccess nữa

Phần liên quan của mô hình trông như thế này:

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

(tôi đã thêm các tùy chọn để thử và buộc nó cùng, nhưng nó đã không giúp Trước đây là tất cả làm việc tốt, và tôi đã không'. t có điều đó.)

Miễn là đối tượng ở trong bộ nhớ, mọi thứ đều hoạt động tốt. Nó chính xác là một HashWithIndifferentAccess, và cuộc sống là tốt. Một khi nó được lưu vào cơ sở dữ liệu, nó sẽ được lưu dưới một Hash thay vì:

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

Có nghĩa là nó không thể được ép buộc trở thành một HashWithIndifferentAccess và những thứ thổi lên như thế này:

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 

Đây là sử dụng Rails 3.1.3, lưu trữ dữ liệu trong MySQL bằng cách sử dụng phiên bản đá quý mysql2 0.3.10. Tôi đang chạy ruby ​​1.9.2p290 là tốt. Tôi có thể thêm thông tin nữa mà bất kỳ ai cũng cho là hữu ích, nhưng tôi thua lỗ về cách gỡ lỗi thêm nữa.

Trả lời

4

1.9.2 thường bao gồm Psych làm thư viện YAML. Tuy nhiên, libyaml là phụ thuộc bên ngoài và 1.9.2 mặc định sử dụng Syck (thư viện cũ) nếu libyaml không có sẵn khi Ruby được biên dịch: link

Thực tế là Psych YAML-izes ActiveSupport :: HashWithIndifferentAccess làm tiêu chuẩn băm là một số oustanding issue trên Github của Psych. Dường như được cố định trong 1.9.3.

3

Dường như đây chỉ là hỏng thẳng với 1.9.2-p290.

Nâng cấp lên 1,9,3 hoặc hạ cấp xuống 1,8,7 và đào tất cả mọi thứ. Tôi muốn có một câu trả lời tốt hơn, mặc dù, nếu bất cứ ai có bất kỳ ý tưởng.

0

Nếu có thể, hãy chuyển sang syck.

Trong application.rb:

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

Chỉ trong trường hợp có ai có cùng một vấn đề tôi đã có, đó là tương tự như sau nhưng không giống nhau, tôi đăng câu trả lời ở đây. Tôi có một băm được serialized trong mô hình, mà là tiết kiệm một cách chính xác cho db. Trong một giao diện tôi cần phải tạo lại băm trong JS, sau đó sẽ tạo các mục trong db chứa bản đồ: ActiveSupport :: HashWithIndifferentAccess thay vì dữ liệu chính xác. Tôi đang tạo ra băm như một chuỗi và sau đó chuyển đổi sang một băm bằng cách sử dụng eval. Điều này tạo ra một Hash, theo yêu cầu. Nhưng sau đó tôi đã đặt băm trở lại băm params, vì vậy tôi có thể sử dụng update_attributes trong bộ điều khiển đã chuyển đổi nó thành HashwithIndifferentAccess, gây ra sự cố

Các vấn đề liên quan