Я хочу запустить некоторый код, прежде чем объект будет удален из ассоциации has_many
.
Я думал, что смогу сделать это с помощью обратного вызова before_remove
, однако по какой-то причине это не срабатывает, и я не понимаю, почему.
class Person < ActiveRecord::Base
has_many :limbs, before_remove: :print_message
def print_message
puts 'removing a limb'
end
end
class Limb < ActiveRecord::Base
belongs_to :person
end
Хотя этокод должен вывести «удаление конечности» во время уничтожения конечности, но это не так.
p = Person.create;
l = Limb.create person: p;
p.limbs.first.destroy
# SQL (2.1ms) DELETE FROM "limbs" WHERE "limbs"."id" = ? [["id", 5]]
# => #<Limb id: 5, person_id: 3, created_at: "2012-01-17 11:28:01", updated_at: "2012-01-17 11:28:01">
Почему это действие destroy
не приводит к тому, что метод print_message
выполнить?
РЕДАКТИРОВАТЬ - существует ли этот before_remove
обратный вызов?
Несколько человек спросили, существует ли этот обратный вызов.Хотя я могу найти очень немного дальнейших ссылок на него, это задокументировано в документации Rails:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Association+callbacks
Это скорее обратный вызов ассоциации, а не корневой ответ ActiveRecord
Редактировать 2 - почему бы просто не использовать before_destroy
на лимбе?
Некоторые люди спрашивают, почему я не использую обратный вызов before_destroy
на лимбе.Причина в том, что я хочу, чтобы человек проверял, есть ли минимальное количество конечностей и что последняя никогда не уничтожается.Это исходная проблема: Как вы гарантируете, что has_many всегда "имеет минимум"?