回调
Mongoid 实现了许多 ActiveRecord 回调 。
文档回调
Mongoid 支持文档的以下回调:
after_initialize
after_build
before_validation
after_validation
before_create
around_create
after_create
after_find
before_update
around_update
after_update
before_upsert
around_upsert
after_upsert
before_save
around_save
after_save
before_destroy
around_destroy
after_destroy
任何文档都可以使用回调,无论该文档是否嵌入到另一个文档中。 请注意,为了提高效率,Mongoid 仅对执行持久性动作的文档调用回调。 这使 Mongoid 能够支持大型层次结构并有效处理优化的原子更新(无需在整个文档层次结构中调用回调)。
请注意,对域逻辑使用回调是一种糟糕的设计实践,并且当链中的回调停止执行时,可能会导致难以调试的意外错误。 我们建议仅将它们用于跨领域关注,例如对背景作业进行排队。
class Article include Mongoid::Document field :name, type: String field :body, type: String field :slug, type: String before_create :send_message after_save do |document| # Handle callback here. end protected def send_message # Message sending code here. end end
回调来自 Active Support,因此您也可以使用新语法:
class Article include Mongoid::Document field :name, type: String set_callback(:create, :before) do |document| # Message sending code here. end end
关联回调
Mongoid 有一组特定于关联的回调,它们是:
after_add
after_remove
before_add
before_remove
每次在以下关联中添加或删除文档时,都会调用相应的回调: embeds_many
、 has_many
和has_and_belongs_to_many
。
关联回调被指定为相应关联上的选项。 添加/删除的文档将作为参数传递给指定的回调。 示例:
class Person include Mongoid::Document has_many :posts, after_add: :send_email_to_subscribers end def send_email_to_subscribers(post) Notifications.new_post(post).deliver end