我有一个像这样的Rails模型类:
class Something < ActiveRecord::Base
before_create do
self.key = SecureRandom.urlsafe_base64(8)
end
end
为什么我可以在此致电before_create
?我希望它是ActiveRecord::Base
的一种方法,但事实并非如此。回调是ActiveRecord::Callbacks
的方法。但是为什么我可以在模型类中调用它们而不包含某些东西?
答案 0 :(得分:3)
你可以这样做,因为ActiveRecord::Base
执行此操作(或类似的东西取决于您的Rails版本):
Base.class_eval do
#...
include Callbacks, ActiveModel::Observing, Timestamp
#...
end
因此ActiveRecord::Base
已包含ActiveRecord::Callbacks
,您的班级会通过继承ActiveRecord::Base
来收回回调。
答案 1 :(得分:2)
因为ActiveRecord :: Base包含了它。见https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L2135
答案 2 :(得分:1)
回调是ActiveRecord中的一个模块,然后模块“混入”到Base,其中'Something'扩展。模块/ Mixins在某些静态语言中类似于接口,但它们还包括方法的实现,而不仅仅是实现它的契约。