2010-02-03 3 views
4

Учитывая этот пример:Рельсы - в каком порядке зависит => уничтожить?

class Server < ActiveRecord::Base 
    has_many :clients,:dependent => :destroy 
    after_destroy: delete_server_directory 
end 

class Client < ActiveRecord::Base 
    belongs_to :server 

    before_destroy :copy_some_important_stuff_from_the_server_directory_before_its_too_late 
end 

Будет ли это порядок уничтожения, когда я звоню server.destroy?

  1. Server#clients, наряду с Client 's before/after_destroy обратных вызовов
  2. Server будут уничтожены
  3. сопровождаемый Server' s after_destroy обратного вызова

ответ

6

Вы можете очень легко проверить. Я взял ваш код и выполнил обратные вызовы простым звонком до puts. Затем начал script/console и имел журнал ActiveRecord на консоль:

>> ActiveRecord::Base.logger = Logger.new(STDOUT) 
=> #<Logger:0x0000000308d2f0 ...> 

Настройка некоторые основные среды:

>> a = Client.create :name => 'Client 1' 
    Client Create (0.4ms) INSERT INTO "clients" ("name", "server_id") VALUES('Client 1', NULL) 
=> #<Client id: 1, name: "Client 1", server_id: nil> 
>> b = Client.create :name => 'Client 2' 
    Client Create (0.5ms) INSERT INTO "clients" ("name", "server_id") VALUES('Client 2', NULL) 
=> #<Client id: 2, name: "Client 2", server_id: nil> 
>> server = Server.create :name => 'The Server' 
    Server Create (0.3ms) INSERT INTO "servers" ("name") VALUES('The Server') 
=> #<Server id: 1, name: "The Server"> 
>> server.clients = [a, b] 
    Client Load (0.4ms) SELECT * FROM "clients" WHERE ("clients".server_id = 1) 
    Client Update (0.4ms) UPDATE "clients" SET "server_id" = 1 WHERE "id" = 1 
    Client Update (0.2ms) UPDATE "clients" SET "server_id" = 1 WHERE "id" = 2 
=> [#<Client id: 1, name: "Client 1", server_id: 1>, #<Client id: 2, name: "Client 2", server_id: 1>] 

И вот суть его:

>> server.destroy 
>>> copy_some_important_stuff_from_the_server_directory_before_its_too_late called! 
    Client Destroy (0.5ms) DELETE FROM "clients" WHERE "id" = 1 
>>> copy_some_important_stuff_from_the_server_directory_before_its_too_late called! 
    Client Destroy (0.2ms) DELETE FROM "clients" WHERE "id" = 2 
    Server Destroy (0.2ms) DELETE FROM "servers" WHERE "id" = 1 
>>> delete_server_directory called! 
=> #<Server id: 1, name: "The Server"> 

Так это выглядит, как вы были мертвы по цели.)

P.S.

  • В модели сервера after_destroy имеется небольшая синтаксическая ошибка.
  • Предполагаю, что с шага 1 вы действительно имели в виду before_destroy, как видно из вашего примера.
+0

Это превосходно и спасибо за отзыв re: регистратор! – robodisco

Смежные вопросы