Tôi có một mô hình lớp Rails với một thuộc tính Hash đăng, như thế này:ActiveRecord chuyển đổi phím biểu tượng thành các chuỗi khi tuần tự băm của tôi
class Action
serialize :metadata, Hash
# . . .
end
cột đó được lưu trữ trong một cột text
với một mã hóa YAML. Vấn đề là khi tôi chuyển giá trị metadata
cho phương thức create!
, các khóa băm được chuyển đổi từ các biểu tượng thành chuỗi, nhưng chuyển đổi đó không xảy ra vào các thời điểm khác. Ví dụ:
$ rails console
> a = Action.create!(:metadata => {:foo => "bar"})
> a.metadata
=> {"foo"=>"bar"}
> a.metadata[:fizz] = "buzz"
> a.metadata
=> {"foo"=>"bar", :fizz=>"buzz"}
Bây giờ khi tôi lưu các mô hình, cơ sở dữ liệu sẽ có giá trị văn bản này:
---
foo: bar
:fizz: buzz
Bất kỳ lời đề nghị làm thế nào để sửa lỗi này?
(Đây là với Rails 3.0.16.)
Liệu nó biểu hiện giống nhau hành vi với 'serialize: metadata, HashWithIndifferentAccess'? – gregates
@gregates: Tôi đã thử nó, và nó có nghĩa là tôi có thể truy vấn băm bằng chuỗi hoặc ký hiệu và nhận giá trị, nhưng có hai vấn đề: 'Action.create! (: Metadata => {: foo =>: bar}) 'đặt ra một ngoại lệ vì tôi không được phép chuyển một Hash thuần túy nữa, và' Action.find (an_old_id) 'tăng một ngoại lệ SerializationTypeMismatch vì Rails không biết cách chuyển đổi YAML thành một HashWithIndifferentAccess. –