舞台:
包含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)
问题:
- 为什么会这样?欢迎任何解释:)
- 如何迭代它的"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。