rails 3.2: after_update также вызывается при уничтожении элементов? - PullRequest
1 голос
/ 14 февраля 2012

У нас есть небольшой класс, у которого есть связанный класс

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 вызывается при уничтожении.Есть ли конкретный способ узнать, какое действие на самом деле происходит в обратном вызове (сохранение / создание / уничтожение)?.

Короче говоря: как правильно справиться с этим?Или это на самом деле какая-то ошибка в рельсах?Или это намеченное поведение?

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Рельсы давно не делали, так что я могу быть не в теме, но вы рассматривали возможность использования опции :autosave?

0 голосов
/ 14 февраля 2012

1) убедитесь, что в вызове car_controller def уничтожить вызовы car.destroy НЕ car.delete, или обратный вызов будет пропущен и двигатель не будет уничтожен.

2) двигатель не удаляется (с тем же идентификатором) или воссоздается? (diff id), вы, кажется, прыгаете от одного к другому в вашем описании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...