我将一些较大的JSON字符串存储为模型中的文本字段,但希望在初始化模型实例时将数据作为OpenStruct变量进行访问。
换句话说:
Model: CrawlCache
Field: results, type: text #Storing a JSON String
当我运行crawl = CrawlCache.find(x)
时,我喜欢抓取。结果不是字符串,而是JSON.parse(crawl.result, object_class: OpenStruct)
的结果
到目前为止,我的代码是:
after_initialize :set_results
def set_results
self.results = JSON.parse(self.results, object_class: OpenStruct)
end
但是当我运行前面提到的crawl = CrawlCache.find(x)
时,crawl.results.class
仍然是一个字符串。
我想要覆盖orignial的原因是出于内存原因,字符串相当大,我不想让内存中的字符串和解析后的对象。这就是为什么我没有走attr_accessor
路线并将其命名为其他原因。
答案 0 :(得分:2)
Rails允许您序列化和反序列化JSON等对象,而无需任何额外的工作或代码。您只需将其添加到模型中即可:
class CrawlCache
serialize :results, JSON
现在,当您保存对象时,它将序列化JSON,当您调用该列时,您可以访问该对象。
http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html
这将实现您的目标,而无需向模型添加自定义回调。