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
这将实现您想要的效果,而无需向您的模型添加自定义回调。
我在我的模型中存储了一些大 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
这将实现您想要的效果,而无需向您的模型添加自定义回调。