Удаление: has_many при обновлении / уничтожении: own_to, если: has_many теперь пусто - PullRequest
0 голосов
/ 10 октября 2009

У меня есть штаты, в которых есть много городов (assign_to: штат), у которых много предприятий (own_to: city). Государство также ... has_many: предприятия,: через =>: города

На моем сайте все управляется с точки зрения бизнеса. Когда новый Бизнес создается / обновляется, создается штат / город, если он еще не существует. Это происходит в вызове: before_save.

У меня проблемы с удалением состояний / сайтов при обновлении бизнеса. Если штат / город, в котором находится компания, изменяется (опять же, это происходит из формы редактирования бизнеса), и в старом штате / городе больше нет предприятий, которые я хочу уничтожить. Я пытался сделать это в вызовах after_save, но они обернуты в транзакции, и даже если я назначу переменные для имен старого штата / города, они, похоже, меняются на новый штат / город в течение транзакции. Это безумие! Я использовал вызовы «put», чтобы напечатать переменные в некоторых местах моей бизнес-модели, и наблюдал, как переменные менялись во время сохранения. Это было неприятно.

Итак, сейчас я обращаюсь к этому с контроллера, но это кажется хакерским.

Вот мой код.

http://pastie.org/648832

Кроме того, я хотел бы получить любую информацию о том, как лучше структурировать все это.

Спасибо

1 Ответ

1 голос
/ 10 октября 2009

Вы хотите, чтобы обратные вызовы after_destroy уничтожали многие стороны отношений, если их нет.

Чтобы обеспечить такое поведение после обновления, нам нужно использовать методы ActiveRecord :: Dirty. Которые встроены в рельсы с 2.1. Если вы используете старую версию, вам понадобится плагин Dirty

class Business < ActiveRecord::Base
  ...
  after_update :destroy_empty_city
  after_destroy :destroy_empty_city

  protected
    def destroy_empty_city
      c = city_changed? ? city_was : city
      c.destroy if c.businesses.empty?
    end


end

class City < ActiveRecord::Base
  ...
  after_destroy :destroy_empty_state

  protected
    def destroy_empty_state
      state.destroy if state.businesses.empty?
    end


end

Возможно, вам придется проверить, если city/state.businesses == [self] вместо city/state.businesses.empty?, загружены ли ваши ассоциации. Я не могу вспомнить, как рельсы относятся к ассоциациям после разрушения. Я предполагаю, что если они будут загружены, то приведенный выше код не будет работать, и вам понадобится дополнительная проверка. В противном случае все должно быть в порядке.

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