2012-03-09 1 views
0

희망 하시겠습니까? 1. 데이터베이스에서 객체 1과 객체 2를 가져옵니다. 둘 다 각각 has_many 연관을 가지고 있습니다. 2. 객체 1의 복제 인 객체 3을 생성하고 따라서 아직 연관이 없습니다 2. 개체 2의 연결을 복제하여 개체 3의 연결에 추가하십시오. 3. 메모리 의 작업에 새 개체 3 사용 4. 데이터베이스에 영구적 인 변경없이 프로세스를 종료하십시오 - 개체 1과 개체 2 프로세스가 종료 될 때 원래의 연관성은 여전히 ​​유지됩니다.메모리 조작을위한 복제 된 mongo mapper 연관

대체 무슨 일이 일어나고 있는지

  1. 나는 물체를 잡아 1 데이터베이스 나 객체 2의 객체 1의 클론이므로
  2. 내가 중복 아직 연관이없는 객체 3을 만들
  3. (모두 2 개 has_many 협회 각을)에서 객체 2 협회 및 추가 그러나 이제 데이터베이스에 영구적 인 변화가
  4. 내가
  5. 나는 프로세스를 종료 메모리에 작업에 새 개체 3를 사용하여 3의 단체 반대합니다 - 목적이 자신의 키를 가지고 있기 때문에 더 이상 연관이 없다 (임시) 객체 3 id로 변경되었습니다.

여기 내 코드입니다. all.last.association1, 나는 빈 상태 (empty)의 배열이 모든 내가 말할 때 지금은

object1 = all.last.clone #we take the most recently created object 
all.each do |instance| 
    instance_association1 = (instance.association1).dup 
    object1.association1 += instance_association1 #BUG this moves the association 
    object1.association1.uniq! 
    instance_association2 = (instance.association2).dup 
    object1.association2 += instance_association2 
    object1.association2.uniq! 
end 

주에있는 개체의 임의의 # 배열을 포함합니다.

도움말 !!

답변

1

MongoMapper의 연관성은 저장시 조금 지나치게 열중 할 수 있습니다. 언젠가 그것을 정밀 검사하고 싶지만 쉬운 문제는 아닙니다.

저장이 수행 될 때 알려주는 코드는 many_documents_proxy.rb입니다. my_association = [...]을 수행하면 replace이 호출됩니다. 배열에 모든 관련 문서를

더 일반적으로
tmp = all.last.clone 
all.each do |instance| 
    instance.association1.each { |doc| tmp.association1.build(doc.attributes) } 
    tmp.association1.uniq! 
    # ... 
end 

, 당신은 변환 할 수 있습니다 : 당신과 같이 임시 객체를 구축 할 수 있습니다 있도록

어떤 저축을하지 않는 유일한 방법은 build입니다 저축에 대해 걱정하지 마십시오.

associations1 = [] 
associations2 = [] 
all.each do |doc| 
    associations1 += doc.associations1.to_a 
    associations2 += doc.associations2.to_a 
end 
assocations1.uniq! 
assocations2.uniq! 

조심해! Ruby의 uniq 메소드는 Ruby의 #hash 메소드를 사용하여 동등성을 계산하는 것처럼 보이기 때문에 원하는 결과를 얻을 수없는 경우가 있습니다. 몇 가지 테스트를 수행하여 my_obj.hash == my_obj2.hash (my_obj == my_obj2)인지 확인하십시오. #hash 메소드를 구현하는 전략에 대해서는 this discussion을 참조하십시오. 필요한 경우 바로가는 경로입니다.