为什么 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)
问题:
- 为什么会这样?欢迎任何解释:)
- 如何迭代其 "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_id
s.
舞台:
一个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)
问题:
- 为什么会这样?欢迎任何解释:)
- 如何迭代其 "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_id
s.