在轨道上删除HABTM ruby​​中的孤儿

时间:2013-08-27 14:53:50

标签: ruby-on-rails ruby

class Actor < ActiveRecord::Base

  has_and_belongs_to_many :movies

  before_destroy :remove_orphaned_initialize
  after_destroy :remove_orphaned


private

  def remove_orphaned_initialize
    @instvariable = self.movies
  end

  def remove_orphaned
    @instvariable.each do |m|
      m.destroy if m.actors.empty? and m.titles.empty?  ##movies also have habtm with Title
    end
  end

end

如果我删除了一个演员记录 那么孤儿电影不会被删除,因为@instvariable在remove_orphaned

中是nil

你能解释一下我是如何实现它的。

如果我尝试在销毁之前调用remove_orphaned,那么m.actors将永远不会为空。 因为目前的医生实例尚未删除

1 个答案:

答案 0 :(得分:0)

这是有问题的,因为没有任何演员的电影不是孤儿,它是没有孩子的父母。如果没有孩子的电影有问题,那么在将电影链接到演员之前创建电影在逻辑上是不可能的。

也许你可以根据电影中的counter_cache做一些事情来存储与它相关的演员数量,并在电影上进行after_update回调,这样如果计数器缓存设置为零则删除电影。不确定对counter_cache值的更改是否会触发after_update回调。

虽然听起来很奇怪。