before_destroy и зависимый уничтожить не стреляя - PullRequest
11 голосов
/ 26 марта 2012

У меня есть следующие ассоциации моделей:

class Slider < ActiveRecord::Base
  has_one :featured_happening, :as => :featured_item, :dependent => :destroy   
  before_destroy :destroy_featured_happening
  after_create :create_featured_happening
end

class FeaturedHappening < ActiveRecord::Base
  belongs_to :featured_item, :polymorphic => true
end

Когда я уничтожаю Slider объект, я думал, что dependent => :destroy автоматически уничтожит featured_item, но это не так.

Контроллер ползунка

 def destroy    
    slider = Slider.find(params[:id])
    slider.delete
    render(:status => :ok, :nothing => true )
  end

Итак, я попытался с помощью before_destroy вызвать обратный вызов, чтобы вручную удалить featured_item, когда объект-ползунок уничтожен и ничего не вызывается.

Как я могуполучить featured_item для удаления при удалении объекта слайдера?Использование Rails 3.2.

Ответы [ 3 ]

20 голосов
/ 26 марта 2012

Вы только что заметили разницу между delete и destroy.В вашем контроллере вы вызываете

slider.delete

, который просто выполняет SQL DELETE, но не вызывает никаких обратных вызовов.Вот почему в обычных случаях вы хотите использовать destroy вместо.Он извлечет объект (при необходимости), вызовет обратные вызовы, включая рекурсивное уничтожение, и только затем удалит объект из базы данных.

См. Документацию по delete и destroy для получения дополнительной информации.

4 голосов
/ 26 марта 2012

Убедитесь, что вы звоните Slider#destroy, чтобы вызвать обратные вызовы.Slider#delete просто удалит запись, не вызывая их.

0 голосов
/ 26 марта 2012
class Slider < ActiveRecord::Base
  has_one :featured_happening,  :dependent => :destroy  
end

class FeaturedHappening < ActiveRecord::Base
  belongs_to :featured_item
end

Если ваш код был простым, как указано выше, в котором есть простые отношения. Затем при удалении слайдера Feature Happing будет удален с удалением слайдера. Но в вашем случае отношения полиморфны. В таблице изменения характеристик в БД abject_id будет идентификатором слайдера или может быть другим классом. Поэтому зависим: уничтожить не работает. Поэтому вам необходимо удалить его с помощью обратного вызова before_destroy, в котором вы сначала извлекаете записи, а затем уничтожаете их

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