Rails 4 在初始化后覆盖 ActiveRecord 模型变量

Rails 4 overwrite ActiveRecord Model variables after init

我在我的模型中存储了一些大 JSON 字符串作为文本字段,但希望在初始化模型实例时将数据作为 OpenStruct 变量访问。

换句话说:

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仍然是一个字符串。

我想覆盖原始文件的原因是出于内存原因,字符串相当大,我不希望内存中的字符串和已解析的对象。这就是为什么我不走 attr_accessor 路线并为其命名的原因。

Rails 允许您序列化和反序列化诸如 JSON 之类的对象,而无需任何额外的工作或代码。您可以简单地将其添加到您的模型中:

class CrawlCache
  serialize :results, JSON

现在,当您保存对象时,它将序列化 JSON,当您调用该列时,您可以访问它,您将是一个对象。

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

这将实现您想要的效果,而无需向您的模型添加自定义回调。