2009-11-19 6 views
1

이 코드를 작성하는 더 좋은 방법이 있습니까? 뭔가처럼 그냥 내가 느끼는 저와 잘 앉지 않는 정말 '와 같은 레일'나는 이미 알고 있어야한다 :레일즈 : belongs_to를 통해 레코드 저장 및 외래 키 설정

belongs_to :parent_in_use 
belongs_to :parent_template 

def after_create 
    new_parent_in_use = ParentInUse.create!(self.parent_template.attributes) 
    self.update_attribute(:parent_in_use_id, new_parent_in_use.id) 
end 

기록을 만든 후 내가 선택한 부모 템플릿을 복용하고 parent_in_use 기록을 만드는 오전 그것을 바탕으로 이렇게하면 템플릿이 변경되고 in_use 레코드가 내 객체와 영원히 함께 살게됩니다. ParentInUse 및 ParentTemplate 클래스는 STI를 사용하여 Parent에서 상속합니다.

나는 이것이 충분히 간단해야한다고 확신하지만, 어떻게 해야할지 모르겠다. 기본적으로 나는 하나의 작업으로 레코드를 할당하고 싶다.

답변

0

이것은 당신이 찾고있는 것을 할 것입니다.

def after_create 
    self.parent_in_use = ParentInUse.create!(parent_template.attributes) 
end 

그러나 다른 변경 사항이 없으면 아무런 도움이되지 않습니다. 외래 키가 현재 모델에 저장되기 때문에, AfterRecord는 after_create 콜백에 의해이 연관이 생성되면 변경 사항을 저장하지 않습니다. 새 ParentInUse 개체가 저장되지만 현재 모델의 데이터베이스 행은 해당하는 parent_in_use_id로 업데이트되지 않습니다.

before_create 콜백으로 호출하면 더 원활하게 진행됩니다.

+0

해당 레코드를 만들기 전에 current_model이 존재했는지 100 % 확신하고 싶었습니다. 모델이 유효하지 않은 경우 before_create 콜백에 도달하지 않는다고 가정합니다. – tsdbrown

+1

그것은 유효한 가정입니다. 또한 모든 콜백은 단일 트랜잭션으로 래핑되며, 그 중 하나가 false를 반환하거나 오류가 발생하면 전체 트랜잭션이 롤백됩니다. 따라서 ParentInUse는 모든 과정이 성공하지 못하면 만들어지지 않습니다. – EmFi