为什么 MongoId 模型会在循环中更改其 object_id?

Why MongoId models change its object_id on loop?

舞台:

一个class包括MongoId:

class Mission

  include Mongoid::Document
  include Mongoid::Timestamps

  attr_accessor :distance

  # ... other atts and methods ...
end

问题:

Rails c中:

$ missions = Mission.all # => get all missions
$ missions[0].object_id # => 70264434234840
$ missions[1].object_id # => 70264410073940
# (for this example I will use only 2 records)
# Now look their object_ids on this loop:
$ missions.each {|m| puts m.object_id} # => 70264350130200, 70264359017780
# Second test with this example again:
$ for m in ms do puts m.object_id end # => 70264374331020, 70264374320260

object_id 循环内外不同,两个循环之间也不同。因此,如果 distance 属性设置在 bucle 内,则在 bucle 外它的值为 nil.

附加信息:

ActiveRecord 和 MongoId:此循环问题仅出现在 MongoId 上,我用 ActiveRecord 测试了相同的示例,object_ids 循环内外相同。

我的推算:

每次调用object_id,都会返回不同的值。 我猜 MongoId 会在实例化任务 (missions[0]) 时进行新的数据库查询,而不使用 missions 集合中的实例 (Mongoid::Criteria)

问题:

  1. 为什么会这样?欢迎任何解释:)
  2. 如何迭代其 "MongoId objects" 在循环内外保留相同的任务实例? (就像 ActiveRecord 一样)

当你这样说时:

missions = Mission.all

您只是 missions 中的一个查询故事。然后每次访问查询,Mongoid都会访问数据库:

missions[0] # One database access
missions[1] # Another database access

如果您想使用一组 Mongoid 模型实例,请这样说:

missions = Mission.all.to_a

当然这会产生很多 Mongoid::Document,因此您需要确保这就是您想要做的。

通常您不会关心 object_id 是什么,您会直接比较 Mongoid 对象(即 obj1 == obj2)或查看它们的 id 而不是它们的object_ids.