子对象无法在 before_destroy 回调中删除父对象
Child object unable to delete parent in before_destroy callback
我正在构建一个日历 Rails 应用程序。
它有事件,可以有一个或多个重复发生的事件。
例如 "Running every Monday, 100 times."
如果用户删除了所有重复事件,那么我希望主事件也被删除。
1 class RecurringEvent < ApplicationRecord
27 belongs_to :event
35 after_destroy :delete_main_event_if_last_current
118 def delete_main_event_if_last_current
119 puts "#{event.recurring_events.size} left"
120 event.destroy if event.recurring_events.empty?
121 end
我的测试
87 it "Delete the main event when the last recurring is deleted", focus: true do
88 event_id = @event.id
89 @event.recurring_events.each { |re| re.destroy! }
90 expect(Event.where(id: event_id).count).to eq 0
91 end
这会产生此输出,但主要事件不是删除。
RecurringEvent
Recurring events
5 left
5 left
5 left
5 left
5 left
知道为什么重复发生的事件不会被删除吗?
与byebug
:
[117, 126] in /app/app/models/recurring_event.rb
117:
118: def delete_main_event_if_last_current
119: puts "#{event.recurring_events.size} left"
120: event.destroy if event.recurring_events.empty?
121: byebug
=> 122: end
123:
(byebug) event.recurring_events.size
5
(byebug) event.recurring_events.first.destroy
nil
(byebug) event.recurring_events.size
5
event.recurring_events
似乎缓存在应用程序中,您正在检查此集合的旧版本。您应该改为查询数据库。我可以看到两个选项。
您可以在每次回调中重新加载关联
event.destroy if event.recurring_events.reload.empty?
或者检查集合中剩余元素的数量:
event.destroy if event.recurring_events.count == 0 #it should query the DB
请注意,如果您 运行 此检查 在 销毁之前,它仍然无法在这种形式下工作。您应该检查被删除的事件是否是最后一个事件,或者在删除子项后删除父项。
中有关缓存的更多信息
我正在构建一个日历 Rails 应用程序。 它有事件,可以有一个或多个重复发生的事件。 例如 "Running every Monday, 100 times."
如果用户删除了所有重复事件,那么我希望主事件也被删除。
1 class RecurringEvent < ApplicationRecord
27 belongs_to :event
35 after_destroy :delete_main_event_if_last_current
118 def delete_main_event_if_last_current
119 puts "#{event.recurring_events.size} left"
120 event.destroy if event.recurring_events.empty?
121 end
我的测试
87 it "Delete the main event when the last recurring is deleted", focus: true do
88 event_id = @event.id
89 @event.recurring_events.each { |re| re.destroy! }
90 expect(Event.where(id: event_id).count).to eq 0
91 end
这会产生此输出,但主要事件不是删除。
RecurringEvent
Recurring events
5 left
5 left
5 left
5 left
5 left
知道为什么重复发生的事件不会被删除吗?
与byebug
:
[117, 126] in /app/app/models/recurring_event.rb
117:
118: def delete_main_event_if_last_current
119: puts "#{event.recurring_events.size} left"
120: event.destroy if event.recurring_events.empty?
121: byebug
=> 122: end
123:
(byebug) event.recurring_events.size
5
(byebug) event.recurring_events.first.destroy
nil
(byebug) event.recurring_events.size
5
event.recurring_events
似乎缓存在应用程序中,您正在检查此集合的旧版本。您应该改为查询数据库。我可以看到两个选项。
您可以在每次回调中重新加载关联
event.destroy if event.recurring_events.reload.empty?
或者检查集合中剩余元素的数量:
event.destroy if event.recurring_events.count == 0 #it should query the DB
请注意,如果您 运行 此检查 在 销毁之前,它仍然无法在这种形式下工作。您应该检查被删除的事件是否是最后一个事件,或者在删除子项后删除父项。
中有关缓存的更多信息