Quando os objetos do Active Record em relacionamentos has_many são salvos?
Estou usando o Rails 1.2.3 (sim, eu sei) e estou confuso sobre comohas_many
trabalha em relação à persistência de objetos.
Por exemplo, vou usar isso como minha declaração:
class User < ActiveRecord::Base
has_many :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :user
end
Pelo que entendi, isso gera, entre outros, um métodoUser#assignments.build
, que cria umAssignment
objeto cujouser_id
é a instância de recebimentoid
(e cujos outros campos são especificados no argumento), mas não salva esse objeto no banco de dados. O objeto pode ser salvo mais tarde chamandoAssignment#save!
.
No entanto, os programadores pragmáticosDesenvolvimento Web ágil com Rails, segunda edição, que eu tenho usado como tutorial e referência, diz:
Se o objeto pai existir no banco de dados, adicionar um objeto filho a uma coleção salvará automaticamente esse filho.
Parece haver uma contradição aqui. O que eu gostaria de saber é:
Se eu fizersome_user.assignments.build
, é oAssignment
objeto salvo?Se eu fizersome_user.assignments << Assignment.new
, é oAssignment
objeto salvo?Se eu fizersome_user.assignments << Assignment.create
, são feitas duas chamadas de banco de dados ou apenas uma? E se eu modificar oAssignment
objeto entre criá-lo e adicioná-lo aosome_user.assignments
?O que acontece se eusave!
aAssignment
objeto cujo correspondenteUser
ainda não foi salvo no banco de dados?P.S. A razão que eu não uso apenasUser#assignments.create
para tudo, é porque ele não me permite extrair a inicialização para um método externo, que gostaria de poder fazer. Eu também não quero fazer várias viagens ao banco de dados.