2016-06-09 2 views
1

저는 레일 프로젝트에 몽고이 보석을 사용하고 있습니다. 메모리에서 모델을 수정하려고 시도했지만, DB를 수정하지 않으므로 결코 저장하지 않으려 고합니다.메모리 몽고 모델에서 안전하게 수정하는 방법은 무엇입니까?

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

그래서 나는 dB에서 우리가 처음 또는 각 항목에 반복 할 때마다 몽고 다시로드를 추측 : 울부 짖는 소리 같이 나는 메모리에로드 모델에서 속성을 수정하기 위해 노력하고있어하지만이 작동하지 않습니다 일부 속성을 설정해도 효과가 없습니다. 설정 한 모든 속성을 다시 반복하면 원래 값으로 설정됩니다. 트랜잭션을 커밋하고 mymodel이 메모리에로드되도록 강제 할 수있는 방법이 있습니까? 적절한 용어를 사용하기가 어렵 기 때문에 내가 말하는 것을 얻을 수 있기를 바랍니다. 두 개의 완전히 다른 모델 인스턴스를 생성하는 데이터베이스에

M.first 
M.first 

두 개의 안타 : first를 호출

답변

1

그래서이 두 가지 질의하는 쿼리입니다. 마찬가지로 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를 호출 할 수 있습니다 로컬 메모리에 데이터베이스 :

MS = 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.att.r; 6; m.save} ') 수정하는 경우 흥미로운 결과가 발생합니다. –