2
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

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

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

如果我在 destroy 之前尝试 cal remove_orphaned ,那么 m.actors 将永远不会为空.. 因为当前的医生实例尚未删除

4

1 回答 1

0

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

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

听起来像一个奇怪的情况。

于 2013-08-27T18:29:38.477 回答