Build vs new in Rails 3 Build vs new in Rails 3 ruby-on-rails ruby-on-rails

Build vs new in Rails 3


You're misreading the docs slightly. some_firm.client.new is creating a new Client object from the clients collection, and so it can automatically set the firm_id to some_firm.id, whereas the docs are calling Client.new which has no knowledge of any Firm's id at all, so it needs the firm_id passed to it.

The only difference between some_firm.clients.new and some_firm.clients.build seems to be that build also adds the newly-created client to the clients collection:

henrym:~/testapp$ rails cLoading 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">] 

If you're creating an object through an association, build should be preferred over new as build keeps your in-memory object, some_firm (in this case) in a consistent state even before any objects have been saved to the database.


You are correct, the build and new functions have the same effect of setting the foreign key, when they are called through an association. I believe the reason the documentation is written like this is to clarify that a new Client object is being instantiated, as opposed to a new active record relationship. This is the same effect that calling .new on a class would have in Ruby. That is to say that the documentation is clarifying that calling build on an association is the same is creating a new object (calling .new) and passing the foreign keys to that object. These commands are all equivalent:

Firm.first.clients.buildFirm.first.clients.newClient.new(:firm_id => Firm.first.id)

I believe the reason .build exists is that Firm.first.clients.new might be interpreted to mean that you are creating a new has_many relationship object, rather than an actual client, so calling .build is a way of clarifying this.