← Back to journalTechnical

Phân biệt build và new trong rails

Sử dụng build hay new cho active record relation trong rails

Phân biệt build và new trong rails

Yêu là hành động. To love is to act.

Victor Hugo

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