2010-02-03 5 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을 호출하면 파열의 순서가됩니까?

server.destroy
    server.destroy before/after_destroy before/after_destroy server.destroy Server#clients
  1. Server
  2. after_destroyafter_destroy 콜백

답변

6

당신은 아주 쉽게 테스트 할 수의 before/after_destroy 콜백

  • Server
  • Server 다음에 파괴 될 것이다 '. 귀하의 코드를 가져 와서 puts에 간단한 호출로 콜백을 구현했습니다. 그런 다음 script/console를 시작하고 콘솔에 액티브 로그를했다 :

    몇 가지 기본적인 환경 설정

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

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

    그래서 당신처럼 보인다 : 여기

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

    를 그리고 그것의 요점이다 목표물에서 죽었다. :)

    P.S.

    • 서버 모델의 after_destroy에 구문 오류가 있습니다.
    • 예를 들어, 1 단계에서 실제로 before_destroy을 의미한다고 가정합니다.
    +0

    팁이 우수하고 감사합니다. 로거! – robodisco

    관련 문제