2

일부 모델은 모두 메모리 (부모 : 자식 : 자식 : 자식)에 함께 연결되어 있으며 최상위 부모를 저장하여 동시에 저장됩니다. 이것은 잘 작동합니다.아직 존재하지 않기 때문에 after_create 콜백 중에 외래 키를 가져올 수 없습니다!

자식 중 하나의 after_create 콜백을 사용하여 변경 로그 테이블을 채우고 싶습니다. changelog 테이블로 복사/푸시해야하는 속성 중 하나는 직접 부모 인 child의 foreign_key이지만 after_create가 발생하면 존재하지 않습니다! 그것은 부모의 전에 after_create 콜백없이

, 나는 아이가 저장되고 있음을 로그에보고 볼 수있는 다음 부모가 삽입 (빈 키 외국은) ... 그 아이는 는 ID와 함께 업데이트입니다 부모. 아이의 after_create는 적시에 실행되지만, Rails가 foreign_key로 자식을 업데이트 할 기회가 있기 전에 발생합니다.

레일스가 특정 순서로 모델 링키지를 강제로 저장하도록 할 수있는 방법이 있습니까? ie.parent, 그 다음 자식 (부모 foreign_key가 존재), 그 자식의 자식 (다시 foreign_key가 접근 가능) 등등 ?? 그렇지 않다면 레코드가 생성되고 foreign_key를 얻은 후에 어떻게 일상적인 화재가 발생합니까?

이 같은 콜백 도움이 될 것 같다 : after_create_with_foreign_keys

당신이 PARENT_ID 사용할 수있는 후 아이를 잡으려고 after_update을 사용할 수

답변

2

필자는 모든 관련 모델을 메모리에 구축하고 최상위 부모를 저장할 때 모든 것을 저장하기 위해 Rails에 의존하기 때문에 after_create 콜백을 활용할 수 없었고 외래 키를 사용할 수 없었습니다 (change_log 테이블 항목) 레일스가 모델을 저장하는 순서 때문에. 모든 것이 항상 올바른 방식으로 연결되었지만, 때로는 자식 레코드가 먼저 저장된 다음 부모 레코드가 저장되고 parent_id를 삽입 할 자식 레코드가 업데이트됩니다.

내 솔루션은 내 모델을 메모리에 저장하지 않고 모든 것을 하나로 저장한다는 아이디어를 포기하는 것이 었습니다. 대신, 가장 위에있는 모델을 저장 한 다음 그 부모의 after_create를 통해 자식을 생성합니다. 그 아이의 after_create는 자식을 생성하는 등의 작업을합니다. 외래 키와 관련하여 콜백을보다 잘 제어 할 수 있으므로이 배열을 훨씬 더 좋아합니다. 마지막으로, 무언가가 끔찍하게 잘못 될 경우 삽입을 취소하기 위해 DB 트랜잭션에 모든 것이 래핑되었습니다. 이것은 메모리에 모든 것을 구축하기위한 원래의 이유 였기 때문에 저장하기 전에 모든 오리를 연속적으로 갖게되었습니다. Model/db 트랜잭션은 걱정을 덜어줍니다.

0

? after_update이 실행되면 parent_id를 사용할 수 있으므로 자식이 테이블에 없으면 삽입하십시오.