2011-03-31 83 views
5

我有mongoid Rails3中mongid嵌入文檔回調

class Address 
    include Mongoid::Document 
    embedded_in :person, :inverse_of => :address 
    after_validation :call_after_validation 
    before_validation :call_before_validation 
    before_update :call_before_update 
    after_update :call_after_update 
    after_create :call_after_create 
    before_create :call_before_create 

    field :address1 
    field :address2 

    private 
    def call_after_validation 
    puts "After validation callback fired." 
    end 

    def call_before_validation 
    puts "Before validation callback fired." 
    end 

    def call_before_update 
    puts "Before update callback fired." 
    end 

    def call_after_update 
    puts "After update callback fired." 
    end 

    def call_after_create 
    puts "After create callback fired." 
    end 

    def call_before_create 
    puts "Before create callback fired." 
    end 



end 

class Person 
    include Mongoid::Document 
    embeds_one :address 

    field :name 
end 

後面的模型現在我用嵌套形式保存個人和地址一次。

但畢竟/前創建/更新回調地址不會被觸發,除了後/ before_validation

的任何建議,爲什麼後/前創建/更新從嵌套形式創建時回調不被解僱的地址?

感謝

+0

更新:我使用mongoid版本2.0.0 beta19 – Gagan 2011-04-01 03:01:41

回答

4

Mongoid只觸發了持續行動是執行對文檔的回調。

因此,在這種情況下,只有驗證回調纔會觸發地址,因爲Address是嵌入到Person中的。將爲Person調用創建/更新回調。

+0

有什麼辦法或黑客通過嵌入式docs before_save/after_save回調將被觸發或可以實現類似的動作。 – Gagan 2011-04-01 06:00:50

+0

不要這麼想,但你可以在Person模型中添加一些代碼來做你想做的事,是嗎? – BenB 2011-04-17 13:02:13

25

您可以使用cascade_callbacks:真正的父文件:

embeds_one:孩子,cascade_callbacks:真

+0

謝謝!雖然通常這是設置沒有必要,對於某些情況下,這是一個非常有用的東西.. – fifigyuri 2012-12-07 08:09:45

+0

謝謝。非常有用的答案。 – 2016-01-07 11:50:58