2010-03-10 16 views
2

다음과 같은 일대 다 연관이 있습니다. 문서에는 많은 섹션이 있고 섹션에는 많은 항목이 있습니다.컨트롤러 동작에서 레일스 자동 저장 연결

- 
Parameters: {"commit"=>"Submit Document", "authenticity_token"=>"4nx2B0pJkvavDmkEQ305ABHy+h5R4bZTrmHUv1setnc=", "id"=>"10184", "document"=>{"section"=>{"10254"=>{"seqnum"=>"3", "item"=>{"10259"=>{"comments"=>"tada"}}}}, "comment"=>"blah"}} 

나는이 다음 업데이트 방법 ...

# PUT /documents/1                                     
# PUT /documents/1.xml 




def update 
    @document = Document.find(params[:id]) 

    # This is header comment 
    @document.comment = params[:document][:comment] 

    params[:document][:section].each do |k,v| 
     document_section = @document.document_sections.find_by_id(k) 
     if document_section 

      v[:item].each do |key, value| 
      document_item = document_section.feedback_items.find_by_id(key) 
      if document_item 

       # This is item comments 
       document_item.comments = value[:comments] 
      end 
      end 

     end 
    end 

    @document.save 

    end 

나는 단지 문서 헤더 주석을 업데이트 문서를 저장

: 여기
class Document < ActiveRecord::Base 
    has_many :document_sections, :dependent => :destroy, :autosave => true 
    has_many :document_items, :through => :document_sections 
end 

class DocumentSection < ActiveRecord::Base 
    belongs_to :document 
    has_many :document_items, :dependent => :destroy, :autosave => true 
end 

class DocumentItem < ActiveRecord::Base 
    belongs_to :document_section 
end 

는 PARAMS 해시입니다. document_item 주석은 저장하지 않습니다. 자동 저장 옵션도 연관을 업데이트하지 않아야합니다. 로그에서

은 다음 DML은 등록 :

UPDATE documents SET updated_at = TO_DATE('2010-03-09 08:35:59','YYYY-MM-DD HH24:MI:SS'), comment = 'blah' WHERE id = 10184 

가 어떻게 문서를 저장하여 연결을 저장 않습니다.

+1

괜찮 으면 게시물의 서식을 정리하십시오. 나는 그것의 절반을 잘못 읽었습니다. 코드 비트를 강조 표시 한 다음 코드 단추를 클릭하여 올바르게 들여 쓰기를 수행합니다 (4 공백). 자신의 예제에서 각 "파일"에 대해 별도의 코드 블록을 만드는 것이 가장 좋습니다. – dpb

+0

@ dpb 동의. 레이아웃을 약간 수정했지만 @ ash34는 구문 강조를 사용하여 개선하려고 시도합니다. 질문은 거의 읽을 수 없다. – marcgg

답변

2

가 나는 문제가 무엇인지 볼 생각합니다.

# Triggers a database call 
document_section = @document.document_sections.find_by_id(k) 

을 그리고 자동 저장에 대한 연결을 유지하기 위해 액티브 기대 : 나는 당신 는 다음을 수행 할 수 있음을 확신합니다. 대신로드 된 레코드를 개별적으로 저장해야합니다. 물론 원자가되지 않을 것입니다. 대신 find_by_id를 호출, 실제로 배열에 가짜 PARAM foo을 수정하고있어 여기

# untested... 
@document.document_sections.collect { |s| s.id == k }.foo = "bar" 

주의 사항 :

나는 자동 저장 당신이 생각처럼 작동하는, 당신이 그런 짓을 할 생각 이는 데이터베이스를 다시 쿼리하고 새 개체를 반환합니다.

당신은 세 번째 옵션은 물론, 원래 계획했던 일을하지만, 모든 트랜잭션을 직접 처리하거나 atmoic가 저장 얻기 위해 등 중첩 된 트랜잭션을 사용할 수 있다는 것입니다. 네이티브에 의해 자동 저장이 모든 관련 데이터의로드를 메모리로 트리거하기 때문에 배열 조작이 작동하기에는 데이터가 너무 큰 경우이 작업이 필요합니다.

모두 응용 프로그램에 따라 다릅니다.


근본적인 문제에 대한 몇 가지 해명 : 당신이 find_by_id 방법을 실행하는 경우

, 당신은 당신에게 해당 쿼리 일치하는 개체의 새로운 세트를 반환하는 ActiveRecord을 요구하고있다. 내가 생각하는 개체 인스턴스에서 호출

DocumentSection.find_by_id(k) 

사물의 상단에 추가하는 레일 그냥 문법 쾌적하다 : 당신이 인스턴스 (document_sections)에서 그 방법을 실행 있다는 사실은 정말 말하는 또 다른 방법입니다 , 그러나 내 마음 속에서 그것은 많은 의미를 가지지 않는다; 일부 응용 프로그램에서는 유용 할 수 있다고 생각합니다. 확실하지 않습니다. 반대편

, collect이 방법은 "슬라이스"블록을 사용하여 배열을 구비 루비 배열 방법이다. 기본적으로 멋진 foreach 루프.:) document_sections 배열과 직접 상호 작용하여 포함 된 객체 ( @document)에 이미로드 된 동일한 객체를 변경하고 save autosave 플래그가 설정된 경우 커밋됩니다.

HTH! 다행 이군. :)

+0

모델은 주요 주제의 두 번째 줄부터 게시된다. 나는 'accepts_nested_attributes_for'를 알고 있습니다. 대량 할당을 사용하지 않으므로 'accepts_nested_attributes_for'옵션을 사용하지 않고이 값을 저장할 것으로 예상됩니다. – user290870

+0

질문을 다시 읽고 내 대답을 조정했습니다. 도움이되는지 알려주세요. – dpb

+0

형식이 잘못되었습니다. 답장을 보내 주셔서 감사합니다. '수집'방법으로 테스트되지 않은 솔루션이 작동합니다!. 나는 네가 말하는 것을 얻는다. 귀하의 의견에 언급 "데이터베이스를 다시 쿼리하고 새 개체를 반환합니다". 필자는 자동 저장 및 데이터베이스 쿼리로로드 된 개체가 동일한 개체 (테이블의 기본 행과 동일한 행)에 대한 참조를 반환하고 어떤 개체 참조가 개체를 수정하는 데 사용되는지는 중요하지 않습니다. 기본 개념을 명확히 할 수 있습니까? 다시 한번 감사드립니다. – user290870

관련 문제