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

时间:2011-09-02 20:50:45

标签: ruby-on-rails ruby ruby-on-rails-3

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

class Something < ActiveRecord::Base

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

end

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

3 个答案:

答案 0 :(得分:3)

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

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

因此ActiveRecord::Base已包含ActiveRecord::Callbacks,您的班级会通过继承ActiveRecord::Base来收回回调。

答案 1 :(得分:2)

答案 2 :(得分:1)

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