2017-04-05 37 views
0

這是我的模型我看起來像:回報率 - 模型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 

我想在after_create末來訪問它的外鍵的值,但它是nil那裏,它去到Exception。即使其他字段不是nil(模型自己的字段),外鍵是。

如果我嘗試訪問after_update中的外鍵,那就沒問題。 這是怎麼回事?

+2

第一件事你必須改變方法名稱 –

+0

@DeepakMahakale謝謝,我做到了,但沒有解決問題。 –

回答

0

Rails將事務內部的每個數據庫更改封裝起來,並且after_update和after_update回調會在該事務內部運行。這意味着,當您調用after_create方法時,數據庫更改未完成,並且您爲parent_model_id獲取空id。

當你創建一條記錄並且你做了任何改變時調用一個after_update回調。在這種情況下,parent_model_id將始終可用,並且您不會收到錯誤

您可以使用多一個回調after_commit。當所有數據庫更改完成時,將調用此回調。它會在兩種情況下被調用,創建新記錄並更新現有記錄。

+0

您可以通過在兩種方法中添加'binding.pry'來檢查自己的值,並檢查差異 – bunty

+0

謝謝,我理解它。 'after_create'和'after_update'之間有什麼辦法可以區分'after_commit'嗎? –

+0

你可以使用':on'選項,例如'after_commit:create_model,on:[:create]'或使用別名'after_create_commit' – bunty