如何避免 rails dependent destroy 中的 N+1 查询?
How to avoid N+1 queries in rails dependent destroy?
Class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
Class Post < ActiveRecord::Base
belongs_to :user
end
当拥有 N 个帖子的用户被销毁时,N+1 个查询将 运行 销毁关联的帖子和用户。在这种情况下如何避免预先加载?
您可以使用
dependent: delete_all
创建一个 SQL 查询来删除相关记录,但是任何 before_destroy
after_destroy
回调都不会被调用,因为没有 destroy
方法会被调用打电话。
如果您使用的是 Postgres,则需要在外键上的原始迁移中传递级联标志才能正常工作
add_foreign_key :some_table, :related_table, on_delete: cascade
Class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
Class Post < ActiveRecord::Base
belongs_to :user
end
当拥有 N 个帖子的用户被销毁时,N+1 个查询将 运行 销毁关联的帖子和用户。在这种情况下如何避免预先加载?
您可以使用
dependent: delete_all
创建一个 SQL 查询来删除相关记录,但是任何 before_destroy
after_destroy
回调都不会被调用,因为没有 destroy
方法会被调用打电话。
如果您使用的是 Postgres,则需要在外键上的原始迁移中传递级联标志才能正常工作
add_foreign_key :some_table, :related_table, on_delete: cascade