2017-04-01 27 views
0

预期功能 - 删除asset_line_item时删除所有链接的asset_items。 (不使用销毁,destroy_all)。我使用的是Postgresdelete_all在每次删除时都不起作用

以下模型:

class AssetLineItem < PurchaseLineItem 

    has_many :asset_items 
    ... 

    after_destroy :destroy_cleanup 

    private 

    def destroy_cleanup 
    asset_items.delete_all 
    end 
end 

这导致剩余asset_items,但是他们所有的asset_line_item列都设置为null。

def destroy_cleanup 
    asset_items.each do |asset_item| 
     asset_item.delete 
    end 
    end 

与回路替换DELETE_ALL以上但是具有删除所有相关asset_items的预期的结果。

尽管我有工作代码,但我很好奇可能导致delete_all以这种方式行事吗?

回答

2

调用只是delete_all结社只是勾销参考。这是一样的delete_all(:nullify)

pry(main)> Booking.last.passengers.delete_all 
    Booking Load (0.6ms) SELECT `bookings`.* FROM `bookings` ORDER BY `bookings`.`id` DESC LIMIT 1 
    SQL (2.8ms) UPDATE `passengers` SET `passengers`.`booking_id` = NULL WHERE `passengers`.`booking_id` = 157 
=> nil 

需要调用delete_all(:delete_all)实际删除相关记录。

这里是docs

或获得预期的效果,你可以下面的行添加到您的AssetLineItem型号:提到

has_many :asset_items, dependent: :destroy 

lakhvir库马尔

而且你destroy_cleanup回调可重构为:

def destroy_cleanup 
    asset_items.map(&:delete) 
    end 

下面是一些很好的联系的话题:

delete_all vs destroy_all?

Rails :dependent => :destroy VS :dependent => :delete_all

+0

我需要删除,所以我的功能不得不看过去的破坏。依赖:: delete_all实际上工作。我想我只是困惑了为什么使用dependent :: delete_all与调用asset_items.delete_all有不同的结果。当我认为会是相同的结果有不同的结果我担心我有某个地方的根本问题。 虽然这是正确的答案 - 它告诉我为什么我的delete_all调用只是将参考归零。我不知道delete_all(:delete_all)干杯! – scottysmalls

0

使用has_many :asset_items dependent: :destroy