2017-04-05 6 views
0

널 : 나는 after_create의 말에 외래 키의 값에 액세스 할RoR에 외부 키 after_create 모델이이처럼 내 모델 보이는 내 어떻게

class MyModel < ActiveRecord::Base 

    belongs_to :parent_model 

    after_create :create_model 

    after_update :update_model 

    def create_model 
    # some code goes here 
    ...... 
    puts "Parent id: " + self.parent_model_id.to_s 
    #parent_model_id is nil here 
    end 

    def update_model 
    puts "Parent id: " + self.parent_model_id.to_s 
    #parent_model_id is as it should be 
    end 

end 

하지만이 nil이며 간다 ~ Exception. 다른 필드가 nil (모델 자체 필드)이 아니더라도 외래 키는입니다.

after_update에서 외래 키를 액세스하려고하면 정상적으로 작동합니다. 여기 무슨 일 이니?

+2

먼저 메서드 이름을 변경해야합니다. –

+0

@DeepakMahakale 감사합니다. 나는 그것을했지만 문제를 해결하지 못했습니다. –

답변

0

레일즈는 트랜잭션 내에서 모든 데이터베이스 변경을 래핑하고 after_create 및 after_update 콜백은 해당 트랜잭션 내에서 실행됩니다. 즉, after_create 메서드를 호출하면 데이터베이스 변경이 수행되지 않고 parent_model_id에 null ID가 표시됩니다.

레코드를 만들고 변경 한 경우 콜백이 호출됩니다. 이 경우 parent_model_id를 항상 사용할 수 있으며 오류가 발생하지 않습니다.

하나 이상의 콜백 인 after_commit을 추가로 사용할 수 있습니다. 이 콜백은 모든 데이터베이스 변경이 완료 될 때 호출됩니다. 두 경우 모두 호출되며 새 레코드를 만들고 기존 레코드를 업데이트합니다.

+0

두 메소드 모두에서'binding.pry'를 추가하여 자체 값을 확인하고 차이를 확인할 수 있습니다. – bunty

+0

고맙습니다. 이해합니다. 'after_create'와'after_update' 사이에서'after_commit'을 구별 할 수있는 방법이 있습니까? –

+0

콜백과 함께'on_commit : create_model, on : [: create]'또는 별칭'after_create_commit'을 사용하여': on' 옵션을 사용할 수 있습니다. – bunty