【问题标题】:How to get object instead of hash from Redis cache?如何从 Redis 缓存中获取对象而不是哈希?
【发布时间】:2017-12-04 07:00:33
【问题描述】:

我正在使用 redis 缓存来保存数据。我正在使用to_json 保存数据。我应该如何获取数据,使其与保存前一样。

保存前

#<CarModel id: 1, car_make_id: 1, title: "Jazz.....

使用JSON.load之后

{"id"=>1, "car_make_id"=>"1",.........}

我是怎么做到的,变成以前的样子

【问题讨论】:

  • By 变得像以前一样,你的意思是你想要一个对象而不是哈希?
  • 是的,你是对的 :)
  • I am saving data using to_json 您正在保存 json 并期待 activerecord 对象..
  • 我怎样才能获得activerecord?

标签: ruby-on-rails ruby caching redis to-json


【解决方案1】:

您的CarModel 已经包含ActiveModel::Serializers::JSON(假设它是一个普通的Rails 模型),所以它响应as_json 将属性作为(JSON 兼容)哈希返回:

car = CarModel.new(id: 1, car_make_id: 1, title: "Jazz")
#=> #<CarModel id: 1, car_make_id: 1, title: "Jazz">

json_object = car.as_json
#=> {"id"=>1, "car_make_id"=>1, "title"=>"Jazz"}

as_jsonto_json 调用以创建 JSON 字符串:(您已使用此方法)

json_string = car.to_json
#=> "{\"id\":1,\"car_make_id\":1,\"title\":\"Jazz\"}"

另一方面,from_json 解析 JSON 字符串:

Car.new.from_json(json_string)
#=> #<CarModel id: 1, car_make_id: 1, title: "Jazz">

请注意,Car.new 创建一个新实例,from_json 只是填充其属性。任何其他状态都不会被序列化。

此外,您的数据库中的对象可能同时已更改,因此最好只存储对象的 id 并从数据库中获取新副本。

【讨论】:

  • 您的意思是to_json 而不是as_json
  • @Md.FarhanMemon no,ActiveModel::Serializers::JSON 提供 as_jsonfrom_json。但是to_json 可能会调用as_json。我没有提供任何进一步的细节,因为整个“将活动记录对象作为 json 存储在 redis 中”在我看来有点可疑。
  • as_json 返回一个Hashto_json 返回一个String,因此它们都是不同的。 from_json 需要 String 来处理,当通过 Hash 时它会抛出 TypeError: no implicit conversion of Hash into String。事实上,您为from_json 共享的参考有一个使用to_json 的示例..
  • @Md.FarhanMemon 你说得对,我把方法弄混了。 to_json 调用 as_json,而不是相反。我已经更新了我的答案。感谢您的提醒。如果您不尝试解决方案,就会发生这种情况;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2013-05-17
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多