Filter dan Pencarian di Ruby on Rails

Beberapa waktu ke belakang di grup facebook Ruby on Rails Indonesia ada sebuah posting menanyakan perihal bagaimana membuat pencarian serta filter di Ruby on Rails pada model yang dimiliki. Saya lumayan terkejut dengan beberapa jawaban yang diberikan karena langsung menyarankan untuk menggunakan Ransack, gem untuk pencarian dan bahkan tidak tanggung-tanggung ada yang menyebutkan Elasticsearch.

Keduanya memang mantap tetapi kalau aplikasinya kecil dan trafik tidak tinggi kenapa tidak menggunakan solusi yang sederhana saja? Apa lagi jika masih dalam tahap belajar Rails itu sendiri, menggunakan fitur bawaan yang dimiliki oleh Rails untuk melakukan pencarian dan filter akan membantu kita memahami Rails dengan lebih baik.

Rails punya where dan juga scope yang bisa digunakan untuk kasus pencarian serta filter kali ini. Akan saya bahas di artikel ini.

Struktur Tabel

Pada artikel ini saya menggunakan 2 buah tabel yang berelasi yaitu tabel categories dan products. Strukturnya sederhana, bisa dilihat di bawah ini.

Untuk kelasnya juga tidak kalah simpel.

where

where di Rails kegunaannya sama dengan klausa WHERE yang ada di SQL yaitu untuk melakukan filtering terhadap data yang kita punya. Misal untuk mencari data produk yang kategori id bernilai 1 maka digunakan where seperti ini.

Contoh lain untuk mencari produk yang memiliki rating 5

Intinya adalah parameter hash yang digunakan berarti key menandakan nama kolom sebagai dasar penyaringan dan value-nya sebagai nilai untuk penyaringan.

where ini bisa disambung atau istilahnya chaining untuk mendapatkan hasil penggabungan lebih dari satu kondisi. Dalam SQL ini berarti penggunaan AND

Bagaimana untuk pencarian?, gabungkan saja dengan klausa LIKE seperti ini.

Penggunaan where di Rails dasarnya adalah sesimpel itu. Untuk mengetahui fitur yang lebih lengkap dari where silakan kunjungi dokumentasi resminya.

Controller

Controller adalah jalan masuk untuk parameter-parameter filter dan pencarian yang dimasukkan oleh pengguna. Oleh karena itu, kita perlu memanggil kode yang melakukan pencarian di dalam controller. Contohnya seperti ini.

Kondisi diperlukan karena bisa saja pengguna tidak menggunakan semua filter yang ada sehingga kita harus menyesuaikan filter mana yang memang digunakan. Ada kemungkinan juga pengguna sama sekali tidak melakukan pemfilteran.

Dan sekarang kita bisa menggunakan filter dan pencarian menggunakan query parameter.

scope

Kode pencarian dan filter kita di atas akan lebih baik jika proses filter dan pencariannya tidak berada langsung di controller karena fungsi dari controller bukanlah untuk itu. Untuk itu, mari kita gunakan scope untuk membuat method yang menangani filter serta pencarian produk.

Scope ini pada dasarnya membuat kelas method untuk kita sehingga misalnya scope rating diubah menjadi kelas method seperti ini hasilnya akan sama.

Sebenarnya ada beda antara scope dengan kelas method, saya bahas di artikel selanjutnya saja 🙂

Nah dengan sudah adanya scope ini kita bisa merapikan kodingan yang ada di controller menjadi seperti berikut.

Lebih Rapi Lagi

Masih bisakah kode kita menjadi lebih rapi lagi?
Bisa!

Dengan memanfaatkan nama parameter yang sama dengan nama scope, kita bisa menggunakan perulangan untuk mengubah kode menjadi seperti di bawah ini. Kunci utamanya selain nama parameter sama dengan nama scope adalah penggunaan method send.

Bagi yang belum tahu, send adalah method yang digunakan untuk memanggil method. Contohnya seperti ini.

Parameter pertama adalah berupa simbol atau string yang merupakan nama dari method yang dipanggil. Parameter kedua dan seterusnya adalah parameter bagi method yang dipanggil pada parameter pertama. Hmm lumayan membingungkan kalimatnya, langsung contoh saja ya.

Menggunakan send untuk memanggil method add maka bentuknya seperti ini.

Sekarang dengan sudah mengerti bagaimana cara kerja send bisa dong memahami bagaimana @products.send(key, value) if value.present? bekerja? 😉

Ah satu lagi, merasa janggal kenapa nama scope yang saya gunakan bernama thename bukan name?

Hal ini karena Rails sudah memberikan kelas method bernama name untuk setiap kelas dari active record sehingga jika kita membuat scope bernama name akan menyebabkan error.

Dan kemudian kenapa nama parameter yang digunakan adalah thename juga ya karena biar bisa menggunakan @products.send(key, value) if value.present? memanfaatkan nama scope yang sama dengan nama parameter.

Semoga pembahasan tentang filter dan pencarian di Ruby on Rails ini membantu 😀

Facebook Comments
 

Agung Setiawan

Agung Setiawan adalah software engineer di BukaLapak.com, penulis sekaligus pecinta sastra, dan pembaca buku

 
Halo, perkenalkan saya Agung Setiawan.
Saya Software Engineer di BukaLapak.
Simak pemikian saya soal dunia Software Engineering via Twitter di @agungsetiawanmu dan facebook
Blog ini saya update seminggu sekali jadi sering-sering saja mampir
Mau belajar Vim bareng saya?
Belajar ngoding dari nol menggunakan PHP

2 thoughts on “Filter dan Pencarian di Ruby on Rails

Leave a Reply

Your email address will not be published. Required fields are marked *