我有两种模式:
# 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>
答案 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