Docs 菜单

Docs 主页Mongoid

回调

在此页面上

  • 文档回调
  • 关联回调

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 支持,因此您也可以使用新语法:

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_manyhas_manyhas_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
←  嵌套属性会话 →