Rails依赖::属于的破坏

时间:2014-10-02 22:43:22

标签: ruby-on-rails ruby-on-rails-4

我有两种模式:

# photo.rb
belongs_to :batch, inverse_of: :photos

# batch.rb
has_many :photos, inverse_of: :batch

我希望只有当它的最后一张照片被销毁时才会销毁一个批次。

# photo.rb
belongs_to :batch, inverse_of: :photos, dependent: :destroy

如果我销毁其中任何一张照片,都会删除该批次。在rails中有没有简单的方法呢?或者我必须做一些丑陋的事情,比如在photos#destroy中处理它?<​​/ p>

1 个答案:

答案 0 :(得分:3)

必须手动完成。以下代码适用于Rails 4.x。

一种简单的方法是在照片模型中使用after_destroy过滤器来检查父批次是否为空,如果是,则销毁它。

# photo.rb

after_destroy :destroy_empty_batch

def destroy_empty_batch
  batch.destroy if batch.photos.empty?
end

然而,允许一个模型操纵另一个模型的对象是不好的设计。正确的方法是在控制器中。不要在模型中使用过滤器,只需在照片控制器中添加两行:

# photos_controller.rb

def destroy
  batch = @photo.batch            # set a batch pointer
  @photo.destroy                  
  batch.destroy if @batch.empty?  # check batch, destroy if empty
  # ...respond_to block...     
end