2014-10-02 48 views
1

我有兩個型號:Rails的依賴:摧毀屬於

# 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 

如果我摧毀了它的任何照片,將刪除該批次。有沒有簡單的方法來做到這一點在鐵軌?或者我必須做一些難看的事情,比如在photos#destroy中處理它?

回答

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 
+0

聲音正確。只是想確認我沒有錯過更好的東西。 – Andrew 2014-10-03 13:45:08