0

我在模型中将较大的 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条路线并将其命名为别的。

4

1 回答 1

2

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

class CrawlCache
  serialize :results, JSON

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

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

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

于 2017-02-27T16:35:03.220 回答