2009-10-09 2 views
0

У меня есть государства, у которых есть много городов (принадлежит_состоянию), у которых есть много предприятий (принадлежит_to: city). Государство также ... has_many: предприятия,: через =>: городаУдаление: has_many, когда: belongs_to обновляется/уничтожается, если: has_many теперь пуст

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

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

Итак, прямо сейчас я обрабатываю это с контроллера, но он чувствует себя хакерским.

Вот некоторые из моих кодов.

http://pastie.org/648832

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

Благодаря

ответ

1

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

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

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? если ваши ассоциации хотят загружены. Я не могу вспомнить, как рельсы относятся к ассоциациям после уничтожения. Я предполагаю, что если они будут загружены, чем код выше, он не будет работать, и вам понадобится альтернативная проверка. В противном случае это должно быть хорошо.

+0

Это нормально для уничтожения предприятий, но не касается обновлений, которые являются реальной проблемой. – kjs3

+0

Извините, я пропустил немного об обновлениях. Я отредактировал свой ответ, чтобы поймать это. – EmFi

Смежные вопросы