2010-02-03 5 views
4

Étant donné cet exemple:Rails - dans quel ordre dépend = = détruire suivre?

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 

Est-ce que ce sera l'ordre de destruction quand je l'appelle server.destroy?

  1. Server#clients, ainsi que Client 's before/after_destroy callbacks
  2. Server seront détruits
  3. suivi du Server' rappel

Répondre

6
s after_destroy

Vous pouvez tester très facilement. J'ai pris votre code, et mis en œuvre les rappels avec un simple appel à puts. Ensuite, lancé script/console et avait ActiveRecord journal à la console:

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

Mettre en place un certain environnement de base:

>> 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>] 

Et voici l'essentiel de celui-ci:

>> 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"> 

Il semble donc que vous étaient morts sur la cible. :)

P.S.

  • Il existe une petite erreur de syntaxe dans le modèle de serveur after_destroy.
  • Je suppose avec l'étape 1 que vous vouliez vraiment dire before_destroy, comme vu dans votre exemple.
+0

c'est excellent et merci pour le conseil re: l'enregistreur! – robodisco

Questions connexes