2016-06-09 3 views
1

Я использую mongoid gem на проекте рельса, и я очень озадачен попыткой изменить модель в памяти, но никогда не сохраняю ее, поэтому я не изменяю db. Я пытаюсь изменить атрибут из модели, загруженной в памяти, но она не работает, как показано ниже:Как безопасно модифицировать модель памяти mongoid?

mymodel = MyModel.where('some criteria') 
mymodel.first.some_attribute = 0 
mymodel.first.some_attribute == 0 -> is false 

Так что я думаю Монго перезагружается из БД каждый раз, когда мы первые или даже зацикливание на каждый вход и установка какого-либо атрибута не влияет, если я снова зациклю все атрибуты, которые я установил, по-прежнему устанавливается на исходное значение. Есть ли способ совершить транзакцию и заставить mymodel оставаться в памяти? Мне трудно использовать правильную терминологию, поэтому я надеюсь, что вы получите то, что я говорю.

ответ

1

Вызов first является запрос, так что это два различных запросов:

M.first 
M.first 

и два удара в базе данных, которые производят два совершенно разных экземпляров модели. Аналогично, вызов M.each { ... } (или другого итерационного метода) дважды ударит по базе данных дважды и создаст два набора полностью разных экземпляров модели. Вы можете посмотреть, что говорит #object_id, чтобы проверить это.

Если вы хотите загрузить объекты и делать вещи, чтобы их потом быть четко об этом:

m = M.first 
m.attr = 0 
# Now m.attr == 0 will be true and you can m.save to update the database 

и для перебора, вы можете вызвать #to_a для выполнения запроса и тянуть кучу экземпляров модели из базы данных в локальную память:

мс = M.some_query.to_a ms.each {...} ms.each {...} # перебирает одних и тех же экземпляров модели как первый ms.each

+0

Thx, это было мое наблюдение но я думал, что выполнение ms = M.where («некоторые критерии»); ms.each {...} будет перебирать экземпляры запроса, но он еще не разрешен и запрос выполняется каждый раз. –

+1

'ms' был бы просто запросом в этом случае, а' ms.each {...} 'не выполняет автоматическое определение и не заполняет запрос, он просто выполняет запрос и выполняет итерации по результатам, как курсор; Я видел, что это вызывает интересные результаты, если вы изменяете при повторении (например, 'ms.each {| m | m.attr = 6; m.save}'), если у вас нет явного упорядочения, которое является постоянным на протяжении всей итерации. –

Смежные вопросы