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

时间:2018-12-06 20:34:49

标签: ruby-on-rails activerecord rails-activerecord

我正在构建一个日历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

这将产生此输出,但主要事件不是删除。

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

1 个答案:

答案 0 :(得分:1)

看来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 Guides中进行缓存的更多信息