为什么在Rails模型类中可以调用回调?

我有一个像这样的Rails模型类:

class Something < ActiveRecord::Base before_create do self.key = SecureRandom.urlsafe_base64(8) end end 

为什么我可以在这里打电话给before_create ? 我希望它是ActiveRecord::Base一种方法,但事实并非如此。 回调是ActiveRecord::Callbacks方法。 但为什么我可以在模型类中调用它们而不包含某些内容?

你可以这样做,因为ActiveRecord::Base执行此操作(或类似的东西取决于您的Rails版本):

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

所以ActiveRecord::Base已经包含了ActiveRecord::Callbacks ,你的类通过inheritanceActiveRecord::Base获取回调。

因为ActiveRecord :: Base包含它。 请参阅https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L2135

回调是ActiveRecord中的一个模块,然后模块被“混入”到Base,’Something’扩展。 模块/混合类似于某些静态语言中的接口,但它们还包括方法的实现,而不仅仅是实现它的契约。