当我使用rails cache来获取数据时,为什么id更改为_id

时间:2016-10-26 13:59:43

标签: ruby-on-rails mongoid grape-api

我使用Rails与grape和Mongo,我想使用Rails缓存来优化性能,这是我的代码:

Rails.cache.fetch(cache_key, expires_in: 1.hour) do
    render_template('chatrooms/info', {chatroom: chatroom, user:current_user, group: chatroom.group})
end

缓存有效,但返回数据已更改。

之前添加缓存,返回数据为:

chatroom: {
   name: "磁场",
   id: "573c025cc5ffa353c7000000",
   owner_id: "56a8b4c9feec620985000000",
   avatar: "http://o2zuoh5os.qnssl.com/icon_magnet.png"
}

否则,添加缓存后,返回数据为:

chatroom: {
   name: "磁场",
   _id: "573c025cc5ffa353c7000000",
   owner_id: "56a8b4c9feec620985000000",
   avatar: "http://o2zuoh5os.qnssl.com/icon_magnet.png"
}

' id'字段已更改为' _id'

我不知道发生了什么,如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

@wind所以基本上mongoDB为每个文档创建_id字段。在mongoid中,他们特别为_id属性& setter / getter方法为id

这是mongoid-6.0.2/lib/mongoid/fields.rb文件

的代码段
  self.aliased_fields = { "id" => "_id" }
  self.fields = {}
  self.localized_fields = {}
  self.pre_processed_defaults = []
  self.post_processed_defaults = []

  field(
    :_id,
    default: ->{ BSON::ObjectId.new },
    pre_processed: true,
    type: BSON::ObjectId
  )

  alias :id :_id
  alias :id= :_id=
end

所以,id和amp; _id在这里是相同的,它只是哪个代码更喜欢哪一个。