Di tutorial resmi dari website Ruby on Rails, terdapat contoh penggunaan method build tetapi sama sekali tidak dijelaskan maksudnya apa. Karena kita adalah manusia maka seharusnya minimal memiliki rasa penasaran buat apa sebenarnya gunanya, kan?.
Method build ini ternyata digunakan untuk membuat sebuah objek baru dari kelas yang memiliki hubungan/asosiasi dengan kelas yang menggunakan method build tadi.
Misal ada 2 kelas yang memiliki hubungan one to many.
1 2 3 |
class Todo has_many :todo_items end |
1 2 3 |
class TodoItem belongs_to :todo end |
Secara logika, antara Todo dengan TodoItem mana dulu yang akan dibuat? Apakah Todo terlebih dahulu baru TodoItem atau justru TodoItem dibuat dulu dan Todo belakangan?.
Biar seragam maka saya katakan kalau Todo dibuat pertama dan TodoItem menyusul kemudian.
1 2 |
todo = Todo.new(todo_params) todo.save |
Setelah todo disimpan pada basis data kemudian akan dibuat todo item dari todo yang baru saja kita buat. Langkahnya tentu saja membuat instance dari kelas TodoItem terlebih dahulu baru kemudian di-save dong. Nah di sini penjelasan build akan menemui intinya.
Menggunakan build, kode yang ditulis adalah seperti ini
1 2 3 |
todo=Todo.find_by(id: params[:id]) todo_item=todo.todo_items.build(todo_item_params) todo_item.save |
Muncul pertanyaan. Jika build pada kasus di atas digunakan untuk menginstantiasi kelas TodoItem menjadi objek, kenapa tidak digunakan method new atau bahkan operator new saja?.
Karena e karena menggunakan build maka automatis nilai foreign key dari todo item yang merujuk ke todo akan dibuatkan untuk kita, tanpa harus mengesetnya secara manual. Selain itu secara automatis pula objek todo item akan dimasukkan ke dalam objek todo sebagai koleksi.
Gambar di atas membuktikan bahwa nilai foreign key diset secara automatis. Sedangkan gambar di bawah menunjukkan bahwa todo item akan langsung dimasukkan di dalam koleksi dari todo.
Terus bagaimana dengan method new? Ternyata sama saja dengan build ?. Dia automatis mengeset foreign key dan juga memasukkan todo item ke dalam koleksi. 2 Gambar di bawah ini akan berbicara.
Gambar pertama menunjukkan pengesetan foreign key dan gambar kedua menunjukkan bahwa todo item sudah masuk sebagai koleksi di dalam todo.
Bingung ya kenapa namanya beda namun kegunaannya sama saja?. Tanya saja ke tim Rails ya kenapa bisa begitu yang jelas build dan new memang method yang sama. Coba buka source code dari Rails di https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb dan cari “alias build new” yang artinya adalah build cuma alias dari new.
Sekarang bagaimaina jika menggunakan operator new?. Berarti kita mesti mengeset foreign key secara manual. Kode di bawah ini menunjukkan perbedaannya.
1 2 3 4 |
todo=Todo.find_by(id: params[:id]) todo_item=TodoItem.new todo_item.todo_id=todo.id todo_item.save |
Dan di bawah ini adalah bukti bahwa foreign key memang belum diset.
Kesimpulannya dua duanya bisa digunakan tetapi build lebih nyaman dan rails way banget.
Semoga bermanfaat, sampai jumpa di tulisan selanjutnya mengenai Rails dan Ruby 😉