Rails - в каком порядке следует зависимый => уничтожить? - PullRequest
4 голосов
/ 03 февраля 2010

Данный пример:

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 before/after_destroy обратных вызовов
  2. Server будет уничтожено
  3. и обратный вызов Server after_destroy

1 Ответ

5 голосов
/ 03 февраля 2010

Вы можете очень легко проверить. Я взял ваш код и реализовал обратные вызовы простым вызовом 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">

Так что, похоже, ты был мертв в цель. :)

приписка

  • В синтаксической модели сервера after_destroy.
  • Я предполагаю, что на шаге 1 вы действительно имели в виду before_destroy, как видно из вашего примера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...