Stai leggendo male i documenti. some_firm.client.new
sta creando un nuovo oggetto Client
dalla raccolta di client e pertanto può impostare automaticamente lo firm_id
su some_firm.id
, mentre i documenti chiamano Client.new
che non ha alcuna conoscenza dell'ID di un'azienda, quindi è necessario passarlo a firm_id
.
L'unica differenza tra some_firm.clients.new
e some_firm.clients.build
sembra essere che build
aggiunge anche il cliente appena creato per la collezione clients
:
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">]
Se si sta creando un oggetto attraverso un'associazione, build
dovrebbe essere preferito su new
come build mantiene il tuo oggetto in memoria, some_firm
(in questo caso) in uno stato coerente prima ancora che qualsiasi oggetto sia stato salvato nel database.
Persone in cerca di una risposta rapida, controllare il 2 ° verso il basso: "costruire" è solo un alias per "nuovo" – ivanreese