Дочерний объект не может удалить родителя в обратном вызове before_destroy - PullRequest
0 голосов
/ 06 декабря 2018

Я строю приложение с календарем 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

Мойtest

   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 голосов
/ 07 декабря 2018

Похоже, что 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

...