Ok. Natknąłem się dzisiaj na bardzo dziwne zachowanie Rails.
[code]class A < ActiveRecord::Base
has_many :bs
end
class B < ActiveRecord::Base
belongs_to :a
end[/code]
[code]a = A.create(:name => ‘a’)
b = B.create(:name => “b1”, :a => a)
a.bs.delete_all
SQL (0.3ms) UPDATE “bs” SET “a_id” = NULL WHERE “bs”.“a_id” = 3 AND “bs”.“id” IN (5)[/code]
Nulluje zamist kasować. Spotkał się z tym ktoś, dałbym sobie rękę uciąć że przed 3.2 tak to się nie zachowywało tylko cięło równo z ziemią.
Anyway dziwne bo jednocześnie a.destroy
dla tego samego scenariusza zupełnie nie rusza rekordów B (spodziewałbym się że zrobi nullify w takim wypadku).
No nic.
Aż zajrzałem do źródła. I wygląda na to że zachowanie delete_all się zmieniło gdzieś w międzyczasie z “wykasuj wszystkie rekordy” na “wykasuj rekordy z tego powiązania” co oznacza “usuń klucz obcy z powiązanych rekordów”
Dla potomności - wygląda na to że teraz zamiast delete_all można próbować użyć a.delete_all_on_destroy (kilka linijek niżej w tym samym pliku, ale komentarz twierdzi że jest to raczej metoda prywatna) albo a.scoped.delete_all