Rails 4在init之后覆盖ActiveRecord Model变量

时间:2017-02-27 15:50:46

标签: ruby-on-rails json activerecord ruby-on-rails-4.2 openstruct

我将一些较大的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路线并将其命名为其他原因。

1 个答案:

答案 0 :(得分:2)

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

class CrawlCache
  serialize :results, JSON

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

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

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