我想在從has_many
關聯中刪除對象之前運行一些代碼。爲什麼在這個has_many關聯中沒有「before_remove」射擊?
我認爲我可以用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文檔中:
這是一個關聯回調雖然而非根ActiveRecord的回調
編輯2 - 爲什麼不在肢體上使用before_destroy
?
有人問爲什麼我沒有在肢體上使用before_destroy
回調。原因是我希望人們檢查是否有最少數量的肢體,並且最後一個從未被破壞。這是原始問題: How do you ensure that has_many always "has a minimum"?
沒有before_remove。至少我不知道它和文檔http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html似乎證實了我的看法。 – lucapette 2012-01-17 11:41:27
@lucapette它與'ActiveRecord :: Associations :: ClassMethods'有關,而不是'ActiveRecord :: Callbacks'。 – shime 2012-01-17 12:03:20
@shime很高興知道。我沒有遇到它。總是有一些東西要學習;) – lucapette 2012-01-17 14:23:18