作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] 关於 rails 的 from_json / to_json
时间Mon Sep 29 22:38:31 2008
※ 引述《suomax (shadow)》之铭言:
: 环境:
: Rails 2.1.0
: Rails 有两个 from_json / to_json 函式,我想利用这两个函式将一个
: 物件阵列存在资料库中,但是搞不太清楚它们的使用方式。
这东西是放在 ActiveRecord::Serialization 中,其中又用到 attribute_names,
我懒得继续追踪下去,rails 内部是一团东西卡在一起,要这样拆开用,
要花一点时间研究。
: 我有一个 class:
: class Foo
: attr_accessor :value
: def initialize(v)
: @value = v
: end
: end
也就是说你这个 Foo 单是 include ActiveRecord::Serialization 是不行的,
刚刚试了一下,会欠 attribute_names, 从哪来的我懒得追踪了。
也许你直接继承 ActiceRecord::Base 会单纯些...
而这边完全没有 include / extend / 继承是不能跑的。
有趣的是,单这样写,to_json 是能动的。但是我看 from_json 需要
attributes= 这个 method, 帮他定义上去之後,to_json 就会烂掉...
同样我也懒得追踪原因了...
: foo_arr = Array.new
: foo_arr << Foo.new(1)
: foo_arr << Foo.new(2)
: foo_json = foo_arr.to_json
: # => "[{\"value\": 1}, {\"value\": 2}]"
: 如果我想把 foo_json 重现回一个 Foo Arry, 要怎麽做呢?
: 谢谢 m(_ _)m
基本上这应该是办不到的,因为 json 里面没有 Foo 的资讯,
他不会知道你要把 json 转成什麽?
假使你的 Foo 继承 ActiveRecord::Base 好了(你的例子里没有),
那麽你可以写成像这样:
ActiveSupport::JSON.decode(foo_json).inject([]){ |result, foo_attrs|
result << Foo.new(foo_attrs)
}
但如果你的 Foo 不需要继承 ActiveRecord::Base, 那你大概有三条路可以走:
1. 想办法利用 ActiveRecord::Serialization, 那就要去看 rails 内部
一团混乱的 source code. 根据我的经验,这很难搞,他内部纠结状况很严重。
2. 自己重作 serialization 吧,没有复杂结构的话,这不难写。
3. 改用 Marshal + Base64 存到 text 栏位中。我看到的 binary 都是这样存的。
不知道单用 Marshal 存到 blob 里面行不行?我资料库不熟。
一般而言我会建议 3, 比较省事...
--
Nobody can take anything away from him.
Nor can anyone give anything to him.
What came from the sea,
has returned to the sea.
Chrono Cross
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
1F:推 ryudo:没错 3.最省事 相信偶吧 10/01 17:13