У меня есть класс TimeWorked
с отношением has_one
(один или ноль) с Event
Event
манипулируется в моем контроллере как nested_resource TimeWorked
и отлично работает для создания и обновления.
Я положил проверку на TimeWorked
, чтобы предотвратить изменение (обновление или уничтожение), когда объект подписан (окончательный вариант).
Я следовал за всеми обновленными ответами (так как Rails 5 изменил способ работы chain_halted
), я мог найти здесь на SO.
Пока я могу предотвратить разрушение или обновление моей основной модели TimeWorked
, но даже с throw(:abort)
ActiveRecord все еще уничтожает связанный с ней ресурс TimeWorkedEvent
.
Как я могу предотвратить уничтожение этой модели И ее вложенного ресурса?
Модели (TimeWorked
/ Event
/ Join table
):
class TimeWorked < ApplicationRecord
has_one :time_worked_event, dependent: :destroy
has_one :event, through: :time_worked_event
accepts_nested_attributes_for :time_worked_event, reject_if: proc {|att| att[:event_id].blank?}
# cannot destroy timeworked that has been signed
before_destroy do
not_signed
throw(:abort) if errors.present?
end
def not_signed
errors.add(:signed, "Cannot modify or destroy a signed timeworked") if signed_exist?
end
end
class Event < ApplicationRecord
end
class TimeWorkedEvent < ApplicationRecord
belongs_to :event
belongs_to :time_worked
validates_presence_of :event
validates_presence_of :time_worked
validates_uniqueness_of :time_worked_id
end
Контроллер:
class TimeWorkedController < ApplicationController
def destroy
@time_worked.destroy
end
end