Dalam Rails 3 docs , build
metode untuk asosiasi digambarkan sama dengan new
metode, tetapi dengan penugasan otomatis kunci asing. Langsung dari dokumen:
Firm#clients.build (similar to Client.new("firm_id" => id))
Saya sudah membaca yang serupa di tempat lain.
Namun, ketika saya menggunakan new
(misalnya some_firm.clients.new
tanpa parameter), klien baru firm_id
asosiasi yang otomatis dibuat. Saya sedang menatap hasil sekarang di konsol!
Apakah saya melewatkan sesuatu? Apakah dokumennya sedikit ketinggalan zaman (tidak mungkin)? Apa perbedaan antara build
dan new
?
ruby-on-rails
ruby-on-rails-3
associations
ClosureCowboy
sumber
sumber
Jawaban:
Anda sedikit salah membaca dokumen.
some_firm.client.new
adalah menciptakan baruClient
objek dari koleksi klien, dan sehingga secara otomatis dapat mengaturfirm_id
untuksome_firm.id
, sedangkan docs panggilClient.new
yang tidak memiliki pengetahuan tentang id setiap Firm sama sekali, sehingga membutuhkanfirm_id
berlalu untuk itu.Satu-satunya perbedaan antara
some_firm.clients.new
dansome_firm.clients.build
sepertinya itubuild
juga menambahkan klien yang baru dibuat keclients
koleksi:Jika Anda membuat objek melalui asosiasi,
build
sebaiknya lebih disukainew
karena build menyimpan objek di-memori Anda,some_firm
(dalam hal ini) dalam keadaan konsisten bahkan sebelum benda apa pun disimpan ke database.sumber
some_firm.client.new
juga menambahkan klien untuksome_firm.clients
, dan memanggilsave
disome_firm
mengakibatkan kesalahan validasi menunjukkan bahwaclient
tidak sah. Jika keduanyanew
danbuild
menambahkan klien baru kesome_firm
koleksi klien, apabuild
yangnew
tidak dilakukan? Saya minta maaf karena padat, di sini!build
hanyalah alias untuknew
:Kode lengkap dapat ditemukan: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74
sumber
alias build new
pada rail 3.2.13build
danbuild_#{association}
. Lihat di sini dan di sini .Rails 4
?Anda benar, build dan fungsi-fungsi baru memiliki efek yang sama dengan pengaturan kunci asing, ketika mereka dipanggil melalui asosiasi. Saya percaya alasan dokumentasi ditulis seperti ini adalah untuk mengklarifikasi bahwa objek Klien baru sedang dipakai, sebagai lawan dari hubungan rekaman aktif baru. Ini adalah efek yang sama yang memanggil. Baru di kelas akan memiliki di Ruby. Dengan kata lain, dokumentasinya mengklarifikasi bahwa memanggil build pada asosiasi adalah sama dengan membuat objek baru (memanggil .new) dan meneruskan kunci asing ke objek tersebut. Semua perintah ini setara:
Saya percaya alasan .build ada adalah bahwa Firm.first.clients.new mungkin diartikan berarti bahwa Anda membuat objek hubungan has_many baru, daripada klien yang sebenarnya, jadi memanggil .build adalah cara untuk menjelaskan hal ini.
sumber
build
vsnew
:misalnya:
untuk yang baru:
Untuk membangun:
Di sini klien disimpan dalam memori, ketika menyimpan perusahaan, catatan terkait juga disimpan.
sumber
Model. Baru
Tag.new post_id: 1
akan instantiate Tag denganpost_id
set -nya .@ model.models.new
@post.tags.build
apakah tag yang sama DAN yang dipakai akan berada di@post.tags
bahkan sebelum itu disimpan.Ini berarti
@post.save
akan menyimpan @post dan tag yang baru dibangun (dengan asumsi: inverse_of diatur). Ini bagus karena Rails akan memvalidasi kedua objek sebelum disimpan, dan tidak ada yang akan disimpan jika salah satu dari mereka gagal validasi.models.new vs models.build
@post.tags.build
dan@post.tags.new
setara (setidaknya sejak Rails 3.2).sumber
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:
?