2015-06-01 1 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 установлен внутри кучки, то из его значения будет значение nil.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

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 s были, вы бы сравнить Mongoid объекты непосредственно (т.е. obj1 == obj2) или посмотреть на их id с вместо их object_id с.

+0

Спасибо @muIsTooShort, ты мой герой! :) .. Я понимаю разницу между 'object_id' vs' id', это было просто для объяснения примера. Спасибо. – CristianOrellanaBak