2015-06-01 42 views
0

階段:爲什麼MongoId模型在循環中更改其object_id?

一類包括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不是內相同和ou t的循環,並且在兩個循環之間也是不同的。所以如果distance屬性被設置在一個bucle中,那麼這個bucle的值就是nil

aditional的信息:

的ActiveRecord和MongoId:此循環問題只MongoId發生時,我測試相同的例子用ActiveRecord和object_ids是相同的內部和外部循環。

我扣:

每次object_id被調用時,將返回不同的值。 我想MongoId使得每當一個任務是實例化一個新的數據庫查詢(missions[0]),而不使用missions裏面的實例是集合(Mongoid ::標準)

問題:

  1. 爲什麼會發生?每個解釋都是值得歡迎的:)
  2. 如何迭代它的「MongoId對象」,以保留循環內外的相同任務實例? (如ActiveRecord的做)

回答

1

當你這樣說:

missions = Mission.all 

你只是故事missions查詢。然後,每次訪問查詢的時候,Mongoid將訪問數據庫:

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

如果你想與Mongoid模型實例的數組工作,那麼這樣說:

missions = Mission.all.to_a 

當然可以創建很多Mongoid::Document s,所以你需要確保這就是你想要做的。

通常你會不在乎什麼object_id小號是,你會比較Mongoid直接對象(即obj1 == obj2),或看着他們id!而非其object_id秒。

+0

感謝@ muIsTooShort,你是我的英雄! :) ..我明白'object_id'和'id'之間的區別,只是爲了解釋這個例子。謝謝。 – CristianOrellanaBak

相關問題