Kiedy są zapisywane obiekty Active Record w relacjach has_many?
Używam Rails 1.2.3 (tak, wiem) i jestem zdezorientowany, jakhas_many
działa w odniesieniu do trwałości obiektu.
Dla przykładu użyję tego jako mojej deklaracji:
class User < ActiveRecord::Base
has_many :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :user
end
Jak rozumiem, generuje to między innymi metodęUser#assignments.build
, który tworzyAssignment
obiekt, któregouser_id
jest instancją odbiorcyid
(i których inne pola są zgodne z argumentem), ale nie zapisuje tego obiektu w bazie danych. Obiekt można zapisać później, dzwoniącAssignment#save!
.
Jednak pragmatyczni programiściAgile Web Development with Rails, wydanie drugie, którego używałem jako samouczka i odniesienia, mówi:
Jeśli obiekt nadrzędny istnieje w bazie danych, dodanie obiektu podrzędnego do kolekcji automatycznie zapisuje to dziecko.
Wydaje się, że jest tu sprzeczność. Chciałbym wiedzieć:
Jeśli zrobięsome_user.assignments.build
, jestAssignment
obiekt zapisany?Jeśli zrobięsome_user.assignments << Assignment.new
, jestAssignment
obiekt zapisany?Jeśli zrobięsome_user.assignments << Assignment.create
, czy wykonano dwa połączenia z bazą danych, czy tylko jedno? A jeśli zmodyfikujęAssignment
obiekt pomiędzy jego utworzeniem a dodaniem gosome_user.assignments
?Co się stanie, jeśli jasave!
naAssignment
obiekt, którego odpowiadaUser
nie został jeszcze zapisany w bazie danych?P.S. Powód, którego nie używamUser#assignments.create
bo wszystko jest dlatego, że nie pozwala mi wyprowadzić inicjalizacji na zewnętrzną metodę, którą chciałbym zrobić. Nie chcę też dokonywać wielu podróży do bazy danych.