子对象无法在before_edestroy回调中删除父对象



我正在构建一个日历Rails应用程序。它有事件,可以有一个或多个重复事件。例如"每周一跑步,100次。">

如果用户删除了所有定期事件,那么我希望主事件也被删除。

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

这会产生此输出,但主事件不是delete。

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缓存在应用程序中,您正在检查此集合的过时版本。您应该转而查询DB。我可以看到两种选择。

您可以在每次回调中重新加载关联

event.destroy if event.recurring_events.reload.empty?

或者检查集合中剩余元素的计数:

event.destroy if event.recurring_events.count == 0 #it should query the DB

请注意,如果您在销毁前运行此检查,它在该表单中仍然不起作用。您应该检查被删除的事件是否是最后一个事件,或者在

有关Rails Guides 中缓存的更多信息

最新更新