0

后,我有些存储大JSON字符串作为文本字段在我的模型,但想有作为OpenStruct变量访问数据时,该模型的实例初始化ActiveRecord的模型变量。轨道4覆盖初始化

换句话说:

Model: CrawlCache 
Field: results, type: text #Storing a JSON String 

当我运行crawl = CrawlCache.find(x)我想crawl.results不为字符串而是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路线并将其命名为别的东西。

回答

2

Rails允许你序列化和反序列化对象,如JSON没有任何额外的努力或代码。当您保存对象

class CrawlCache 
    serialize :results, JSON 

现在,它会序列化JSON,当你调用列,您可以访问它,你将一个对象:你可以简单地添加到您的模型。

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html

这将实现你想要的东西,而无需自定义的回调添加到您的模型。