gpt4 book ai didi

ruby-on-rails - :dependent => :destroy isn't calling the destroy method before the deletion?

转载 作者:行者123 更新时间:2023-12-01 08:28:46 27 4
gpt4 key购买 nike

我有一个笔记模型,具有以下关联

注意.rb

has_many :note_categories, :dependent => :destroy
has_many :categories, :through => :note_categories

创建 NoteCategory 模型是为了充当笔记和类别之间的连接表。最初它只是一个模型/表格,但我创建了一个 Controller 来在有人从笔记中删除类别时执行一些自定义操作。

note_categories_controller.rb

def destroy
p "in notes_categories_controller destroy"
note_category_to_delete = NoteCategory.find(params[:id])
#some custom stuff
note_category_to_delete.destroy
respond_to do |format|
format.html { redirect_to(notes_url }
format.xml { head :ok }
end
end

这很好用,因为我可以使用此链接创建一个按钮,该按钮将从笔记中删除类别:

<%= button_to 'Remove', note_category, :confirm => 'Are you sure?', :controller => :note_categories, :method => :delete %>

而且效果很好。

问题是,当我删除一个笔记时,属于该笔记的 note_category 行被删除,但销毁方法没有运行。我知道这是因为自定义代码没有运行,第一行的终端输出没有出现在终端中。这是终端输出:

Note Load (0.7ms)   SELECT * FROM "notes" WHERE ("notes"."id" = 245) 
NoteCategory Load (0.5ms) SELECT * FROM "note_categories" WHERE ("note_categories".note_id = 245)
NoteCategory Destroy (0.3ms) DELETE FROM "note_categories" WHERE "id" = 146
Note Destroy (0.2ms) DELETE FROM "notes" WHERE "id" = 245

我认为通过使用 :dependent => :destroy,NoteCategories Controller 中的 destroy 方法应该在它被删除之前运行。我做错了什么?

最佳答案

:dependent => :destroy 将在 model 而不是 controller 上调用 destroy 方法。

来自documentation :

If set to :destroy all the associated objects are destroyed alongside this object by calling their destroy method.

也就是说,如果您希望在销毁之前对您的 note_categories 进行自定义,则必须覆盖 NoteCategory 模型 中的 destroy 方法,或者使用after_destroy/before_destroy 回调。

无论哪种方式,使用 :dependent => :destroy 都不会执行 Controller 中包含的代码,这就是为什么您看不到 puts 语句的输出在终端。

关于ruby-on-rails - :dependent => :destroy isn't calling the destroy method before the deletion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3547616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com