如何避免 Rails 依赖销毁中的 N+1 查询?

Pav*_*hra 5 performance ruby-on-rails associations eager-loading destroy

Class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
end

Class Post < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

当拥有 N 个帖子的用户被销毁时,将运行 N+1 个查询来销毁关联的帖子和用户。在这种情况下如何避免急切加载?

ben*_*sop 4

您可以使用

dependent: delete_all
Run Code Online (Sandbox Code Playgroud)

它创建一个 SQL 查询来删除关联的记录,但before_destroy after_destroy不会调用任何回调,因为destroy不会调用任何方法。

如果您使用的是 Postgres,则需要在外键上的原始迁移中传递级联标志才能正常工作

add_foreign_key :some_table, :related_table, on_delete: cascade
Run Code Online (Sandbox Code Playgroud)