build là phương thức của collection (dùng với bảng quan hệ)

Khi dùng build và new với collection thì có một chút khác biệt:

Ví dụ ta xét có quan hệ firm has many clients

 

1. Khác nhau giữa Client.new và firm.clients.new

- Client.new sẽ không khởi tạo firm_id

- firm.clients.new (hoặc firm.clients.build) sẽ khởi tạo firm_id

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 > Client.new                  # Create a new client
#=> #<Client id: nil, firm_id: nil, created_at: nil, updated_at: nil> 
r:003 > some_firm.clients.new       # Create a new client
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 

 

 

2. Khác nhau giữa firm.clients.new và firm.clients.build

- firm.clients.new thì Client mới được khởi tạo sẽ không có trong collection của firm

- firm.clients.build thì Client mới được khởi tạo sẽ nằm trong collection của firm

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">] 

 

Nguồn tham khảo:

http://stackoverflow.com/questions/4954313/build-vs-new-in-rails-3