У нас есть небольшой класс, у которого есть связанный класс
class Car
has_one :engine, :dependent => :destroy
after_update :save_engine
delegate :oil_level, :oil_level=, :to => :engine
def save_engine
engine.save if engine
end
end
Как вы можете сказать, мы пытаемся обойти проблему, заключающуюся в том, что дочерние элементы не сохраняются автоматически в рельсах.Таким образом, мы можем установить oil_level
для автомобиля, и он будет правильно сохранять его в engine
при сохранении.
Что теперь происходит, когда мы пытаемся удалить автомобиль?Очевидно, engine
никогда не удаляется, и это вызвано after_update
, который будет повторно сохранять только что удаленный движок.Таким образом, автомобиль успешно удален, но двигатель воссоздан (новый идентификатор) и больше не связан с автомобилем.Я хочу, чтобы двигатель был удален правильно.
Я нашел надежный обходной путь:
class Car
has_one :engine, :dependent => :destroy
after_update :save_engine
before_destroy :set_destroying
delegate :oil_level, :oil_level=, :to => :engine
def set_destroying
@destroying = true
end
def save_engine
engine.save if engine && !@destroying
end
end
Но он все еще выглядит немного грязным, как будто должен быть лучший способ сделатьэтот.Кажется немного нелогичным, что after_update
вызывается при уничтожении.Есть ли конкретный способ узнать, какое действие на самом деле происходит в обратном вызове (сохранение / создание / уничтожение)?.
Короче говоря: как правильно справиться с этим?Или это на самом деле какая-то ошибка в рельсах?Или это намеченное поведение?