设有如下关系

class Human < ApplicationRecord
  has_one :spirit, dependent: :destroy
  has_many :cells, dependent: :destroy                                                                                                                                                                                                  
end

class Cell < ApplicationRecord
  belongs_to :human                                                                                                                                                                                                                     
end

class Spirit < ApplicationRecord
  belongs_to :human, dependent: :destroy                                                                                                                                                                                                
end

删除human,则其所有cell和spirit都会被删掉,并且是先于human删掉

[1] pry(main)> hm = Human.create name: 'jack'
[2] pry(main)> hm.cells << Cell.new
[3] pry(main)> hm.cells << Cell.new
[4] pry(main)> hm.create_spirit
[5] pry(main)> hm.destroy
   (0.1ms)  begin transaction
  SQL (0.2ms)  DELETE FROM "spirits" WHERE "spirits"."id" = ?  [["id", 3]]
  SQL (0.1ms)  DELETE FROM "cells" WHERE "cells"."id" = ?  [["id", 6]]
  SQL (0.1ms)  DELETE FROM "cells" WHERE "cells"."id" = ?  [["id", 7]]
  SQL (0.1ms)  DELETE FROM "humen" WHERE "humen"."id" = ?  [["id", 5]]
   (2.1ms)  commit transaction
=> #<Human:0x007fcffb09c040 id: 5, name: "jack", created_at: Sun, 30 Jul 2017 15:17:49 UTC +00:00, updated_at: Sun, 30 Jul 2017 15:17:49 UTC +00:00>

删除spirit,则紧接着human也会被删掉(当然,human关联的cell会先删掉)

[1] pry(main)> hm = Human.create name: 'jack'
[2] pry(main)> hm.cells << Cell.new
[3] pry(main)> hm.cells << Cell.new
[4] pry(main)> hm.create_spirit
[5] pry(main)> sp = hm.spirit
[6] pry(main)> sp.destroy
   (0.1ms)  begin transaction
  SQL (0.2ms)  DELETE FROM "spirits" WHERE "spirits"."id" = ?  [["id", 2]]
  SQL (0.1ms)  DELETE FROM "cells" WHERE "cells"."id" = ?  [["id", 4]]
  SQL (0.1ms)  DELETE FROM "cells" WHERE "cells"."id" = ?  [["id", 5]]
  SQL (0.1ms)  DELETE FROM "humen" WHERE "humen"."id" = ?  [["id", 4]]
   (2.1ms)  commit transaction
=> #<Spirit:0x007fcffa3a1188 id: 2, human_id: 4, created_at: Sun, 30 Jul 2017 15:15:09 UTC +00:00, updated_at: Sun, 30 Jul 2017 15:15:09 UTC +00:00