Ви трохи неправильно читаєте документи. some_firm.client.new
створює новий Client
об'єкт з колекції клієнтів, і тому він може автоматично встановити firm_id
на some_firm.id
, в той час як документи закликають Client.new
, що не має знання про ід яких - або фірм взагалі, тому потребує firm_id
передана їй.
Єдина відмінність між some_firm.clients.new
і, some_firm.clients.build
здається, полягає в тому, що build
також додає новоствореного клієнта до 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">]
Якщо ви створюєте об'єкт через асоціацію, build
слід віддавати перевагу new
тому, що збірка зберігає ваш об’єкт пам’яті some_firm
(у цьому випадку) у послідовному стані навіть до того, як будь-які об’єкти будуть збережені в базі даних.