为什么MongoId模型在循环上改变它的object_id



舞台:

包含MongoId的类:

class Mission
  include Mongoid::Document
  include Mongoid::Timestamps
  attr_accessor :distance
  # ... other atts and methods ...
end

问题:

In 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属性,则圈外其值为nil

Aditional信息:

ActiveRecord和MongoId:这个循环问题只发生在MongoId,我用ActiveRecord测试了相同的例子,object_ids在循环内外是相同的。

我演绎

:

每次调用object_id时,返回不同的值。我猜MongoId使一个新的数据库查询每当一个任务是实例化(missions[0]),而不使用missions的集合内的实例(MongoId::Criteria)

问题:

  1. 为什么会这样?欢迎任何解释:)
  2. 如何迭代它的"MongoId对象"在循环内外保持相同的任务实例?(与ActiveRecord一样)

当你说:

missions = Mission.all

你只是故事一个查询在missions。然后每次访问查询时,Mongoid将访问数据库:

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

如果你想使用一个mongodb模型实例数组,那么这样说:

missions = Mission.all.to_a

当然,这会产生很多Mongoid::Document,所以你需要确定这是你想要做的。

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

相关内容

  • 没有找到相关文章

最新更新