2011-09-02 44 views
2

我有這樣一個Rails模型類:爲什麼在Rails模型類中可以調用回調函數?

class Something < ActiveRecord::Base 

    before_create do 
    self.key = SecureRandom.urlsafe_base64(8) 
    end 

end 

爲什麼我可以叫before_create在這裏?我期望它是一個ActiveRecord::Base的方法,但事實並非如此。回調是ActiveRecord::Callbacks的方法。但爲什麼我可以在模型類中調用它們而不包含某些東西?

回答

3

你可以做到這一點,因爲ActiveRecord::Base做到這一點(或者根據你的Rails的版本類似的東西):

Base.class_eval do 
    #... 
    include Callbacks, ActiveModel::Observing, Timestamp 
    #... 
end 

所以ActiveRecord::Base已經包括ActiveRecord::Callbacks和類由ActiveRecord::Base繼承拿起回調。

1

回調是ActiveRecord中的一個模塊,Module然後'混合'到'Something'擴展的Base中。 Modules/Mixins類似於一些靜態語言中的接口,但它們也包含一種方法的實現,而不僅僅是一個實現它的協議。

相關問題