class ColorCoder
# Called to deserialize data to ruby object.
def load(data)
end
# Called to convert from ruby object to serialized data.
def dump(obj)
end
end
class Fruits < ActiveRecord::Base
serialize :color, ColorCoder.new
end
# lib/json_wrapper.rb
require 'json'
class JsonWrapper
def initialize(attribute)
@attribute = attribute.to_s
end
def before_save(record)
record.send("#{@attribute}=", JsonWrapper.encrypt(record.send("#{@attribute}")))
end
def after_save(record)
record.send("#{@attribute}=", JsonWrapper.decrypt(record.send("#{@attribute}")))
end
def self.encrypt(value)
value.to_json
end
def self.decrypt(value)
JSON.parse(value) rescue value
end
end
3)添加模型回调:
#app/models/user.rb
class User < ActiveRecord::Base
before_save JsonWrapper.new( :name )
after_save JsonWrapper.new( :name )
def after_find
self.name = JsonWrapper.decrypt self.name
end
end
class JSONColumn
def initialize(default={})
@default = default
end
# this might be the database default and we should plan for empty strings or nils
def load(s)
s.present? ? JSON.load(s) : @default.clone
end
# this should only be nil or an object that serializes to JSON (like a hash or array)
def dump(o)
JSON.dump(o || @default)
end
end
8条答案
按热度按时间mwecs4sa1#
在Rails 3.1中,您只需
希望能有所帮助
tquggr8v2#
在Rails 3.1中,您可以将自定义编码器与
serialize
一起使用。希望这对你有帮助。
参考文献:
serialize
的定义:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L556Rails附带的默认YAML编码器:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/coders/yaml_column.rb
这就是调用
load
的地方:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods/read.rb#L1326jjcrrmo3#
更新
下面是mid给出的高评分答案,这是一个更适合Rails〉= 3.1的答案。
也许这就是你要找的。
更新
1)安装'json' gem:
2)创建JsonWrapper类
3)添加模型回调:
4)测试一下!
附言:
这不是很干,但我已经尽力了。如果有人能修复
User
模型中的after_find
,这将是伟大的。bvk5enib4#
在这个阶段,我的需求不需要大量的代码重用,所以我的精简代码是上面答案的一个变体:
干杯,总算轻松了!
k7fdbhmy5#
使用
composed_of
方法的serialize :attr, JSON
的工作方式如下:其中url是要使用json序列化的属性,auth是模型上可用的新方法,它以json格式将其值保存到url属性中。(尚未完全测试,但似乎正在工作)
db2dz4w86#
我写了我自己的YAML编码器,它使用默认值。
由于
load
和dump
是示例方法,因此需要在模型定义中将一个示例作为第二个参数传递给serialize
。我试着在IRB中创建一个新示例,加载一个示例,转储一个示例,看起来一切都正常。我也写了一个blog post。
aelbi1ox7#
一个更简单的解决方案是使用
composed_of
,如this blog post by Michael Rykov中所述。我喜欢这个解决方案,因为它需要使用更少的回调。下面是它的要点:
xyhw6mcr8#
Aleran,你在Rails 3中使用过这个方法吗?我遇到了同样的问题,当我看到Michael Rykov的这篇文章时,我正朝着序列化的方向前进,但是在他的博客上发表评论是不可能的,或者至少在那篇文章上是不可能的。据我所知,他是说你不需要定义Settings类,然而,当我尝试这个的时候,它一直告诉我设置没有定义。所以我只是想知道你是否用过它,还应该描述什么?谢谢。