Está mal leer los documentos un poco. some_firm.client.new
está creando un nuevo objeto Client
de la colección de clientes, por lo que puede establecer automáticamente firm_id
en some_firm.id
, mientras que los documentos están llamando al Client.new
que no tiene ningún conocimiento de ninguna Firma, por lo que necesita el firm_id
.
La única diferencia entre some_firm.clients.new
y some_firm.clients.build
parece ser que build
añade también el cliente recién creado a la clients
colección:
henrym:~/testapp$ rails c
Loading development environment (Rails 3.0.4)
r:001 > (some_firm = Firm.new).save # Create and save a new Firm
#=> true
r:002 > some_firm.clients # No clients yet
#=> []
r:003 > some_firm.clients.new # Create a new client
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>
r:004 > some_firm.clients # Still no clients
#=> []
r:005 > some_firm.clients.build # Create a new client with build
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>
r:006 > some_firm.clients # New client is added to clients
#=> [#<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>]
r:007 > some_firm.save
#=> true
r:008 > some_firm.clients # Saving firm also saves the attached client
#=> [#<Client id: 1, firm_id: 1, created_at: "2011-02-11 00:18:47",
updated_at: "2011-02-11 00:18:47">]
Si va a crear un objeto a través de una asociación, debe preferirse build
más de new
ya que la compilación mantiene su objeto en memoria, some_firm
(en este caso) en un estado constante incluso antes de que los objetos se hayan guardado en la base de datos.
Las personas que buscan una respuesta rápida, marque la segunda abajo: "compilar" es solo un alias para "nuevo" – ivanreese